我一直在做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项目,在其中设置所需的所有内容,然后启用构建日志记录,进行构建并分析所有命令及其参数的构建日志。