如何使用MSVC在Windows中的命令行构buildDLL

我一直在做C约20年,但我从来没有build立一个DLL; 我一直喜欢静态链接。

我使用命令行cl.exe等和gnumake makefile来构build我的Windows应用程序。

我现在想build立一个DLL,我很困惑。

最终,我将以.lib和.dll结尾。 .lib包含存根代码,在运行时加载DLL并使用其中的代码。

我一直在查看命令行的lib和链接,并不清楚我应该做什么,产生这个输出。

所以我有一些问题。

cl是否需要额外的参数来表明它正在编译一个DLL? (我知道DLL导出的原型需要__declspec(dllexport))。

我知道链接需求/ DLL作为一个参数。

我会运行lib 链接,分别产生.lib和.dll,或将链接产生?

我还需要知道什么?

在命令行上使用:

 cl.exe /LD <files-to-compile> 

或者,如果您更喜欢更详细和明确的版本:

 cl.exe /D_USRDLL /D_WINDLL <files-to-compile> <files-to-link> /link /DLL /OUT:<desired-dll-name>.dll 

发现它自动发生。

如果你已经导出了函数(例如/ export,__declspec(dllexport)等),链接器会自动生成.lib文件(当然你需要在链接器命令行上输入/ dll)。

cl是否需要额外的参数来表明它正在编译一个DLL? (我知道DLL导出的原型需要__declspec(dllexport))。

不是因为Win3x离开了,现在你只需要__declspec(dllexport)或一个.DEF文件,它定义了你想要导出的符号的名字。 一个.def文件允许你使用修改后的名字导出符号,所以它在特殊情况下仍然有用。

我知道链接需求/ DLL作为一个参数。

是的。

我会运行lib和链接,分别产生.lib和.dll,或将链接产生?

lib仅用于创建静态库(或将.objs添加到您的implib)链接将生成一个.dll和一个导入.lib为它。

Simlar to Ebow Halm的答案,但使用.def文件列出导出的函数和较新的命令行参数:

 "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" && cl /O2 /Iall /Iyour /Iincludes /D_USRDLL /D_WINDLL /DOTHER_DEFINES <libs> <source files> /LD /Fe<dll name> /link /DEF:<def name>.def 

参考文献:

找出最简单的方法就是创建一个MSVC项目,在其中设置所需的所有内容,然后启用构建日志记录,进行构建并分析所有命令及其参数的构建日志。