【C++】VS2019 创建并使用动态链接库

静态库:函数和数据被编译进一个二进制文件,通常扩展名为.lib,在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件。

动态库:往往提供2个文件,一个是引入库和一个DLL,引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。

一、创建动态链接库

创建DLL动态链接库的新项目

右键"源文件">"添加">"新建项",创建Func.cpp源文件

写两个方法:Add()和Sub()

生成解决方案后,debug文件下就生成了动态链接库了DllTest.dll

在方法前面加上前缀   _declspec(dllexport)  再点击生成解决方案,生成 DllTest.lib 文件

二、使用动态链接库

创建控制台应用程序项目 

回到文件夹路径Debug文件下 复制dll 和 lib 文件 到Test项目的目录下

 

再回到VS,点击"项目">"属性">"链接器">"输入",找到附加依赖项,输入刚才创建的lib文件,点击应用,确定。

点击生成解决方案,就可以调用创建的动态链接库了

 

 

参考文档:https://www.cnblogs.com/asce/p/11621588.html

 

已标记关键词 清除标记
新建项目时“应用程序设置”里选择“导出符号”vs会自己导出一个变量和一个函数,我在另一个工程里引用VS导出的变量和函数都没有问题。 引用我自己导出的那个函数就是不行??? //头文件:ConsoleApplication1.h ``` #ifdef CONSOLEAPPLICATION1_EXPORTS #define CONSOLEAPPLICATION1_API __declspec(dllexport) #else #define CONSOLEAPPLICATION1_API __declspec(dllimport) #endif //这是VS自己导出的函数声明 CONSOLEAPPLICATION1_API int fnConsoleApplication1(void); //这是我的导出函数声明 CONSOLEAPPLICATION1_API int fnAddTwo(int a,int b); ``` //CPP文件:ConsoleApplication1.cpp ``` // 这是VS导出示例函数的实现。调用这个函数没有问题 CONSOLEAPPLICATION1_API int fnConsoleApplication1(void) { return 42; } //这是我导出函数的实现,调用提示无法解析符号 CONSOLEAPPLICATION1_API int fnAddTow(int a, int b) { return a + b; } //END ``` 然后我自己新建一个空白工程: ``` #include "ConsoleApplication1.h" //已加入工程目录 #pragma comment(lib,"ConsoleApplication1.lib") //这个也加入库目录 #include <iostream> int main() { int a = 1, b = 2; //调用我导出的函数,提示链接错误,注释掉就链接成功 std::cout << "fnAddTwo(1, 2) = " << fnAddTwo(a, b) << std::endl; //调用VS自己导出的函数没问题 std::cout << fnConsoleApplication1() << std::endl; return 0; } //END ``` 错误提示: 1>main.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) int __cdecl fnAddTwo(int,int)" (__imp_?fnAddTwo@@YAHHH@Z),该符号在函数 _main 中被引用 1>e:\my documents\visual studio 2013\Projects\Project1\Debug\Project1.exe : fatal error LNK1120: 1 个无法解析的外部命令
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页