如何构建Windows平台下的动态库DLL


在构建动态库时,生成两个文件:导入库(.lib)和动态库(.dll)。GCC和mingw默认情况下会导出所有符号,但是vs默认情况下不导出任何符号。如果dll没有导出任何符号,则vs就不会生成导入库(这就是为什么vs构建dll时只生成了.dll,没有生成.lib的原因)。如果要导出函数或类型,必须使用__declspec( dllexport )。

在VS平台构建dll库时,CMAKE会添加如下预处理定义MyLibrary_EXPORTS,其中MyLibraryProject Name,在工程属性的C/C++|Preprocessor|Preprocessor Definitions可以查看或手工添加修改。

在生成库的工程代码中,写:

导出声明

如果不想使用CMAKE默认的预定义符号MyLibrary_EXPORTS,也可以自己定义符号。如需要定义预处理符号COMPILING_DLL,方法如下:

Preprocessor Definitions

当然,有的时候我们并不是想要编译库,就是想要添加一个定义,从而在我们程序中可以写诸如:

此类的话,让程序先做判断,进而根据判断结果做一些事情(比如在某种情况下定义某个函数)

那么我们就可以在CMakeLists中添加如下代码:

(targetName 和 definitionName 处自己修改)

这样,在工程属性的C/C++|Preprocessor|Preprocessor Definitions可以查看到添加了definitionName。

ps:常用的宏定义

_WIN32,WIN32,_WIN64们摘一段

在 Win32 配置下,_WIN32 有定义,_WIN64 没有定义。在 x64 配置下,两者都有定义。即在 VC 下,_WIN32 一定有定义。

因此,WIN32/_WIN32 可以用来判断是否 Windows 系统(对于跨平台程序),而 _WIN64 用来判断编译环境是 x86 还是 x64。

发表评论

电子邮件地址不会被公开。 必填项已用*标注