如何使用MSVC从Windows中的命令行构建DLL

时间:2009-07-15 09:56:37

标签: c windows visual-c++ dll build

我已经做了大约20年的C,但我从来没有构建过DLL;我总是喜欢静态链接。

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

我现在想要构建一个DLL,我很困惑。

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

我一直在查看lib和link的命令行,但是我不知道应该做什么,以产生这个输出。

所以我有一些问题;

cl是否需要任何其他参数,以表明它正在编译DLL? (我知道DLL导出的原型需要__declspec(dllexport))。

我知道链接需要/ dll作为参数。

我会运行lib 链接,分别生成.lib和.dll,还是链接生成两者?

我还需要知道什么?

5 个答案:

答案 0 :(得分:33)

在命令行上使用:

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

或者,如果您更喜欢更详细的&amp;显式版本:

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

答案 1 :(得分:3)

原来它会自动发生。

如果你有导出的函数(例如/ export,__ declspec(dllexport)等),链接器将自动生成.lib文件(你当然需要在链接器命令行上使用/ dll)。

答案 2 :(得分:2)

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

参考文献:

答案 3 :(得分:1)

  

cl是否需要任何其他参数,以表明它正在编译DLL? (我知道DLL导出的原型需要__declspec(dllexport))。

自Win3x消失以来,现在您只需要__declspec(dllexport)或.DEF文件,该文件定义了您想要导出的符号的名称。 .def文件允许您导出带有修改名称的符号,因此它对于特殊情况仍然有用。

  

我知道链接需要/ dll作为参数。

是的。

  

我会运行lib和link,分别生成.lib和.dll,还是链接生成两者?

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

答案 4 :(得分:0)

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