首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一分钟详解VS中快速生成dll和lib方法

一分钟详解VS中快速生成dll和lib方法

作者头像
3D视觉工坊
发布2020-12-11 16:10:26
发布2020-12-11 16:10:26
2.9K0
举报

问题:如果我们在Visual Studio工程中,想要快速学习如何生成dll和lib,有什么小技巧呢?

方法:在VS工程中添加新项目,操作具体方法如图1、图2所示。

经过上述步骤,则可以生成一个新项目,新项目自动生成的文件如图3所示。

对于其中的testDll-2.h文件,具体内容如下:

***testDll-2.h**start***

// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 TESTDLL2_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // TESTDLL2_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef TESTDLL2_EXPORTS #define TESTDLL2_API __declspec(dllexport) # else #define TESTDLL2_API __declspec(dllimport) #endif // 此类是从 testDll-2.dll 导出的 class TESTDLL2_API CtestDll2 { public: CtestDll2(void); // TODO: 在此添加您的方法。 }; extern TESTDLL2_API int ntestDll2; TESTDLL2_API int fntestDll2(void);

***testDll-2.h**end***

对于testDll-2.cpp文件,具体内容如下:

***testDll-2.cpp**start***

// testDll-2.cpp : 定义 DLL 应用程序的导出函数。 #include "stdafx.h" #include "testDll-2.h" // 这是导出变量的一个示例 TESTDLL2_API int ntestDll2=0; // 这是导出函数的一个示例。 TESTDLL2_API int fntestDll2(void) { return 42; } // 这是已导出类的构造函数。 // 有关类定义的信息,请参阅 testDll-2.h CtestDll2::CtestDll2() { return; }

***testDll-2.cpp**end***

通过上述的示例demo,很容易能够理解对于类(class)、对于外部函数、变量如何进行操作,即可编译生成dll和lib。

那么有时候,我们需要添加命名空间,又该如何操作呢?

很简单,只需要在外围添加一个命名空间即可,其他不变,示例如下:

***testDll-2.h**start**namespace***

// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 TESTDLL2_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // TESTDLL2_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef TESTDLL2_EXPORTS #define TESTDLL2_API __declspec(dllexport) #else #define TESTDLL2_API __declspec(dllimport) #endif namespace testDLL2 { // 此类是从 testDll-2.dll 导出的 class TESTDLL2_API CtestDll2 { public: CtestDll2(void); // TODO: 在此添加您的方法。 }; extern TESTDLL2_API int ntestDll2; TESTDLL2_API int fntestDll2(void); }

***testDll-2.h**end**namespace***

对于testDll-2.cpp,修改如下:

***testDll-2.cpp**start**namespace***

// testDll-2.cpp : 定义 DLL 应用程序的导出函数。 #include "stdafx.h" #include "testDll-2.h" namespace testDLL2 { // 这是导出变量的一个示例 TESTDLL2_API int ntestDll2 = 0; // 这是导出函数的一个示例。 TESTDLL2_API int fntestDll2(void) { return 42; } // 这是已导出类的构造函数。 // 有关类定义的信息,请参阅 testDll-2.h CtestDll2::CtestDll2() { return; } }

***testDll-2.cpp**end**namespace***

经过上述步骤即可以生成lib以及dll,那么如何调用上述生成的dll与lib呢?

新建一个test工程,在「附加包含目录」包含进上述的.h文件所在的目录,附加库目录包含进上述的lib目录,dll文件放在工程的生成目录即可。

在test工程中新建main.cpp文件:

***test**main.cpp***

// test.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include "testDll2.h" #pragma comment(lib, "testDll2.lib") using namespace testDLL2; int main() { int val = 0; val = fntestDll(); return 0; }

***test**main.cpp**end***

可能对于上述过程中,所使用的语法:

#pragma comment(lib, "testDll2.lib") 有些初学者会产生些疑问,这里给出我自己对于它的理解。

对于C++中,如果要指定链接的库,比如我们要链接WSock32.lib的时候,我们当然可以不辞辛苦的将它加入到你的工程。但是我觉得更方便的方法是使用#pragma指示符,指定要链接的库。

这个是题外话了,上述如有不足之处,欢迎留言多多批评指正。

注:文章的最后,感谢欢哥对于写作本文给出的指点。

上述内容,如有侵犯版权,请联系作者,会自行删文。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 3D视觉工坊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档