vs生成dll怎么弄(2022vs生成dll教程)

vs生成dll怎么弄(2022vs生成dll教程)

最近编程碰到动态链接库编译错误比较多,经过周末查询微软MSDN后,终于梳理成一篇文章,记性不大好,做点笔记。。。

新建一个动态链接库项目MathLibrary,如下图所示:

MathLibrary.h

// 下列 ifdef 块是创建使从 DLL 导出更简单的// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 MATHLIBRARY_EXPORTS// 符号编译的。在使用此 DLL 的// 任何项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将// MATHLIBRARY_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的// 符号视为是被导出的。//MathLibrary.h /*Function : MathLibrary DLL Author : Wen Fangjun Date : 2022/07/10 */#ifdef MATHLIBRARY_EXPORTS#define MATHLIBRARY_API __declspec(dllexport)#else#define MATHLIBRARY_API __declspec(dllimport)#endif// 此类是从 dll 导出的class MATHLIBRARY_API CMathLibrary {public: CMathLibrary(void); // TODO: 在此处添加方法。 int mul(int x, int y);};extern MATHLIBRARY_API int nMathLibrary;MATHLIBRARY_API int fnMathLibrary(void);/*reutrn sum of a b*/extern “C” MATHLIBRARY_API int add(int a, int b);/*return sum of 1 to 100 */extern “C” MATHLIBRARY_API int sum100(void);

MathLibrary.cpp

// MathLibrary.cpp : 定义 DLL 的导出函数。//#include “pch.h”#include “framework.h”#include “MathLibrary.h”// 这是导出变量的一个示例MATHLIBRARY_API int nMathLibrary=0;// 这是导出函数的一个示例。MATHLIBRARY_API int fnMathLibrary(void){ return 0;}// 这是已导出类的构造函数。CMathLibrary::CMathLibrary(){ return;}MATHLIBRARY_API int add(int a, int b){ return (a b);}MATHLIBRARY_API int sum100(void){ int i = 0; int sum = 0; for (; i <= 100; i ) { sum = i; } return sum;}MATHLIBRARY_API int CMathLibrary::mul(int x, int y) { return (x*y);}

调用MathLibrary库

新建项目MathLibraryDemo, 如下:

// MathLibraryDemo.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。///*Function : Test DLL MathLibraryAuthor : Wen Fangjun Date : 2022/07/10*/#include <iostream>#include “MathLibrary.h”int main(){ std::cout << “Hello World!\n”; CMathLibrary *mathObj = new CMathLibrary(); std::cout << mathObj->mul(3, 4) << std::endl;}// 运行程序: Ctrl F5 或调试 >“开始执行(不调试)”菜单// 调试程序: F5 或调试 >“开始调试”菜单// 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件// 2. 使用团队资源管理器窗口连接到源代码管理// 3. 使用输出窗口查看生成输出和其他消息// 4. 使用错误列表窗口查看错误// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

编译报错C1083

C1083 无法打开包括文件: “MathLibrary.h”: No such file or directory

再次编译项目,

编译报错C1083

C1083 无法打开包括文件: “MathLibrary.h”: No such file or directory

错误消失 !!!

这时出现错误LNK2019

错误 LNK2019 无法解析的外部符号 “__declspec(dllimport) public: __cdecl CMathLibrary::CMathLibrary(void)” (__imp_??0CMathLibrary@@QEAA@XZ),该符号在函数 main 中被引用 MathLibraryDemo

错误 LNK2019 无法解析的外部符号 “__declspec(dllimport) public: int __cdecl CMathLibrary::mul(int,int)” (__imp_?mul@CMathLibrary@@QEAAHHH@Z),该符号在函数 main 中被引用 MathLibraryDemo

编译错误消失,但DLL文件无法链接

没有告诉链接器MathLibrary.lib文件怎么链接

设置完成后,错误 LNK2019 无法解析的外部符号 “__declspec(dllimport) public: __cdecl CMathLibrary::CMathLibrary(void)” (__imp_??0CMathLibrary@@QEAA@XZ),该符号在函数 main 中被引用 MathLibraryDemo

错误 LNK2019 无法解析的外部符号 “__declspec(dllimport) public: int __cdecl CMathLibrary::mul(int,int)” (__imp_?mul@CMathLibrary@@QEAAHHH@Z),该符号在函数 main 中被引用 MathLibraryDemo

均消失不见。。。

项目MathLibraryDemo可以正确完成编译和链接。。。

最后一步,运行MathLibraryDemo

运行失败,提示找不到MathLibrary.dll文件

解决办法:拷贝MathLibrary.dll文件到项目MathLibraryDemo中

再次运行项目MathLibraryDemo,

项目运行成功!

到此,使用VS创建动态链接库DLL文件结束。。。

难攀登的不只有高山,

还有所料未及的茫然。

与君共勉

by Amos

写于2022/07/10

附:个人网站访问链接,

http://aizaozhidao.vip

发表评论

登录后才能评论