VS中动态库的创建和调用

这篇具有很好参考价值的文章主要介绍了VS中动态库的创建和调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

VS中动态库的创建和调用

是写好的现有的,成熟的,可以复用的代码。库的存在形式本质上来说库是一种可执行代码的二进制。

​ 库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接阶段,静态库的链接阶段是在项目编译的时候静态链接。动态库是在程序运行的时候由代码加载链接。

​ 静态库和动态库的区别主要是在链接阶段处理库的方式不同而区分的。

静态库

概念

​ 静态库指的是在链接阶段直接将库和目标文件一起打包成可执行文件的方式所使用的库就称为静态库。

体现形式

​ .a 或者 .lib 文件

优缺点

优点 :①使可执行文件依赖项少,已经被打包到可执行文件中了。 ②编译阶段完成链接,执行期间代码装载速度快

缺点:①使可执行文件变大。②若作为其他库的依赖库,将会造成多余的副本,因为必须与目标文件打包。③升级不方便,升级必须重新编译

静态库的创建
  1. 使用VS创建一个空项目;
  2. 创建空项目之后将项目设置为静态库(点击项目 -> 属性 -> 常规 -> 配置类型)中修改;
  3. 配置项目lib输出位置(常规 -> 输出目录 :指的是dll输出的文件位置);
  4. 书写接口,在静态库中,只要是可以允许访问的函数和类都可以被使用,没有特别的函数导入和导出。

例程:

#pragma once
#include <iostream>

class Arithmetic
{
public:
    // Returns a + b
    static double Add(double a, double b);//可以调用

    // Returns a - b
    static double Subtract(double a, double b);//可以调用

    // Returns a * b
    static double Multiply(double a, double b);//可以调用

    // Returns a / b
    static double Divide(double a, double b);//可以调用

    void fun2();//可以调用

private:
    static void fun();//不可以调用
    void fun1();//不可以调用
};

#include "Arithmetic.h"

double Arithmetic::Add(double a, double b)
{
    return a + b;
}

double Arithmetic::Subtract(double a, double b)
{
    return a - b;
}

double Arithmetic::Multiply(double a, double b)
{
    return a * b;
}

double Arithmetic::Divide(double a, double b)
{
    return a / b;
}

void Arithmetic::fun2() {
    std::cout << "公共  void Arithmetic::fun2()" << std::endl;
}

void Arithmetic::fun() {
    std::cout << "私有  static void Arithmetic::fun()" << std::endl;
}
void Arithmetic::fun1() {
    std::cout << "私有  void Arithmetic::fun1()" << std::endl;
}
静态库的调用
  1. 创建一个项目
  2. 配置项目属性,导入静态库位置。
  3. 导入头文件:C/C++ -> 常规 -> 附加包含目录 :指的是需要使用的自己编写的头文件
  4. 导入库文件:链接器 -> 常规-> 附加库目录 :指的是在调用的时候声名需要使用的lib文件。
  5. 添加导入lib名称:链接器 -> 输入 -> 附加依赖项 :指的是在调用的时候声名需要使用的lib文件。
  6. 引入库的头文件,之后直接使用库即可。

动态库

概念

动态库指的是在程序运行过程中动态加载库的方式使用的库,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。

体现形式

​ .DLL、.lib 和 .a 、.so ;

优缺点

好处:程序自身的体积不会因为动态函数库变大。
缺点:就是程序运行过程中使用到了这些函数库内的功能时,万一系统特定的位置没有对应的动态库。就会造成程序崩溃或者各种奇怪的问题。

动态库的创建

在介绍动态库的创建之前,我们先来了解以下的宏。

#pragma once
#ifdef PUBFUN_EXPORTS
#define PUBUTIL_DLL __declspec(dllexport)
#else
#define PUBUTIL_DLL __declspec(dllimport)
#endif

MSVC编译器提供了一系列C/C++的扩展来指定符号的导入导出,即__declspec属性关键字。

dllexport与dllimport存储级属性是微软对C和C++的扩展,可用于从dll中导入或导出函数、数据、对象(objects)

__declspec(dllexport) 表示该符号是从本DLL导出的符号。

__declspec(dllimport) 表示该符号是从别的DLL中导入的。

我们在创建动态库的时候需要用到上面的宏。

创建方式1:使用空项目

  1. 使用VS创建一个空项目;
  2. 创建空项目之后将项目设置为动态库(点击项目 -> 属性 -> 常规 -> 配置类型)中修改;
  3. 配置项目lib 和 DLL 输出位置(常规 -> 输出目录 :指的是dll输出的文件位置);
  4. 创建一个header.h (此文件名可以自由定义)定义之后将上面的宏写入到文件中(宏名称可以自己定义)。
  5. 使用定义的宏定义动态库导出的函数或者类。
  6. 编译生成动态库。

例程:

创建动态库导出导入宏

//header.h
#pragma once
#ifdef BD_TEST
#define BDTEXT_DLL __declspec(dllimport)
#else
#define BDTEST_DLL __declspec(dllexport)
#endif

使用宏定义导出的函数

//testDLL.h
#pragma once
#include "header.h"

int  BDTEXT_DLL add(int a, int b);

导出函数功能的实现

//testDLL.cpp
#include "testDLL.h"

int add(int a, int b) {
	return a + b;
}

编译:

VS中动态库的创建和调用,VS,c++
这就是最后编译出来的lib和dll库。

创建方式2:直接创建动态库项目

使用直接创建动态库项目,会在项目中生成一个dllMain.cpp的文件。如下:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: 
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

根据微软官网说明:

DllMain是动态链接库 (DLL) 的可选入口点。 当系统启动或终止进程或线程时,它将使用进程的第一个线程为每个加载的 DLL 调用入口点函数。 使用 LoadLibraryFreeLibrary 函数加载或卸载 DLL 时,系统还会调用 DLL 的入口点函数。

之后其他的接口函数和接口类和空项目的建立是一样的。

动态库的调用
  1. 创建一个项目
  2. 导入头文件:C/C++ -> 常规 -> 附加包含目录 :指的是需要使用的自己编写的头文件
  3. 导入库文件:链接器 -> 常规-> 附加库目录 :指的是在调用的时候声名需要使用的lib文件。
  4. 添加导入lib名称:链接器 -> 输入 -> 附加依赖项 :指的是在调用的时候声名需要使用的lib文件。
  5. 引入库的头文件,之后直接使用库即可。
  6. 将于lib配套的dll放到执行文件exe所在的文件目录下。

例程:

配置头文件

VS中动态库的创建和调用,VS,c++

配置lib文件位置

VS中动态库的创建和调用,VS,c++

配置需要使用lib文件

VS中动态库的创建和调用,VS,c++

配置完成之后编写代码

#include <iostream>
#include <testDLL.h>//引入头文件

int main() {

	std::cout << add(2, 5) << std::endl; //调用库中的函数
	getchar();
	return 0;
}

注意点:

1、没有设置为导出的函数名称或者类,无法在外部调用dll使用。导出的函数和类必须使用导出宏修饰。

项目常见配置项

常规 -> 输出目录 :指的是dll输出的文件位置

常规 -> 中间目录 :指的是中间件的输出位置

常规 -> 配置类型 :指的是项目类型

VC++目录 -> 包含文件 :指的是三方库文件的头文件位置

VC++目录 -> 库目录 : 指的是三方库文件(.dll .lib)文件

C/C++ -> 常规 -> 附加包含目录 :指的是需要使用的自己编写的头文件

C/C++ -> 预处理器 -> 预处理器定义 : 指的是我们需要配置的宏定义

链接器 -> 输入 -> 附加依赖项 :指的是在调用的时候声名需要使用的lib文件。

链接器 -> 高级 -> 导入库 : 指的是lib导出的文件位置文章来源地址https://www.toymoban.com/news/detail-783128.html

到了这里,关于VS中动态库的创建和调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT笔记——vs + qt 创建一个带界面的 dll 和 调用带界面的dll

    用VS + qt 生成dll 和 调用生成的dll 环境: vs 2019 + qt 5.12 创建dll 上一次我们是直接使用的qt 为我们提供方便的类库创建 ,这次呢 我们自己写类库 第一步:创建一个QT应用程序 第二步,修改程序为 生成dll 并且 我修改了生成的所在路径 添加QT的模块 ,自己用了什么,就添加什

    2024年02月03日
    浏览(43)
  • [速成] Visual Studio C/C++创建Dll(动态链接库)并调用

    以下示例均在VS2022环境下完成。 注意: _EXPORTING 是笔者 自定义宏 ,用于区分当前是导出dll还是调用dll,要实现导出函数,还需要在实现Dll函数功能的 项目属性 里,添加 预处理定义 (记得结尾加 分号 ),如下图: _declspec(dllexport) 是VC的,表示 导出函数 到dll; _declspec(dllim

    2024年02月04日
    浏览(48)
  • (VS报错)已在 xxxxx.exe 中执行断点指令(__debugbreak()语句或类似调用)-解决方法&&C++创建对象四种方式

     上述报错困扰了我好几天,在网上搜了一天,到最后还是没有解决问题 试过通过项目属性-C/C+±代码生成-启用增强指令集-选择AVX,这种方法也没用 但问题出现在创建对象时内存分配问题上  如果是这样创建对象,并且写了析构函数会报错,把析构函数删去之后程序就能正常

    2024年02月07日
    浏览(41)
  • 同态加密库Seal库的安装(win11+VS2022)

    先说一下,seal库是微软开发的同态加密库,目前支持三种算法bfv,bgv和ckks。提供的语言版本是C艹和C#。 这是github上提供的要求。 要准备的东西有 vs2022(社区版就行了,网上一堆教程), cmake(最新版貌似是3.25,网上也有一堆教程), git(这个主要是因为后续在下载seal库

    2023年04月08日
    浏览(93)
  • 【嵌入式学习笔记-02】什么是库文件,静态库的制作和使用,动态库的制作和使用,动态库的动态加载

    【嵌入式学习笔记-02】什么是库文件,静态库的制作和使用,动态库的制作和使用,动态库的动态加载 单一模型: 将程序中所有功能全部实现于一个单一的源文件内部。编译时间长,不易于维护和升级不易于协作开发。 分离模型 将程序中的不同功能模块划分到不同的源文件

    2024年01月15日
    浏览(56)
  • 调用GPL 开源库的法律问题

    调用 GPL(General Public License)开源库通常是合法的,但是需要遵守 GPL 协议的规定。使用 GPL 开源库可能会涉及到一些问题,以下是一些你可能需要考虑的方面: 遵守 GPL 协议 : 使用 GPL 开源库时,你需要遵守 GPL 协议的规定。这包括在你的项目中使用 GPL 开源库时,必须将你

    2024年03月11日
    浏览(47)
  • 用VS2019图形学安装openGL库的详细步骤以及报错处理

    链接:https://pan.baidu.com/s/1F1gmz9a2uJ5FShRccZRqZw  提取码:lyzz 将文件保存下来放在新建的一个文件夹内,建议不要放在C盘上。然后将文件解压,可以看到如下五个文件: 1文件glut.h放在下面路径中: 在目录C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30037includ

    2024年02月04日
    浏览(52)
  • 动态链接库(三)--动态链接库的使用

    本文示例基于上章的Dll1项目生成的动态链接库学习简单使用. 所需文件:因为上节的示例没有添加Dll1.h头文件,因此这里只需Dll1.dll,Dll1.lib 在本文中会添加Dll1.h头文件以优化动态链接库的创建. 既然要在项目中使用别人创建生成的dll, 那么首先得将dll加载到自己得项目中去才

    2024年02月03日
    浏览(38)
  • 【动态库】Ubuntu 添加动态库的搜索路径

    在运行程序时,经常遇到下面这种动态库加载失败的情况,这时往往是系统在动态库的搜索路径下没有找到对应的库文件导致的。  目录 一、使用 LD_LIBRARY_PATH 二、修改 /etc/ld.so.conf 环境变量 LD_LIBRARY_PATH是动态库的搜索路径,一般情况下为空,可执行文件运行时,会去这个环

    2024年02月07日
    浏览(45)
  • 【linux深入剖析】动态库的使用(续) | 动静态库的链接

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 回顾上节,我们在创建了动态库libmymath.so 我们使用指令 gcc main.c -L. -lmymath -L . (-L + 路径表示myc这个库在哪

    2024年04月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包