我已经做了大约20年的C,但我从来没有构建过DLL;我总是喜欢静态链接。
我使用命令行--cl.exe等 - 和gnumake makefile,来构建我的Windows应用程序。
我现在想要构建一个DLL,我很困惑。
最终,我将以.lib和.dll结尾。 .lib包含存根代码,在运行时加载DLL并使用其中的代码。
我一直在查看lib和link的命令行,但是我不知道应该做什么,以产生这个输出。
所以我有一些问题;
cl是否需要任何其他参数,以表明它正在编译DLL? (我知道DLL导出的原型需要__declspec(dllexport))。
我知道链接需要/ dll作为参数。
我会运行lib 和链接,分别生成.lib和.dll,还是链接生成两者?
我还需要知道什么?
答案 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项目,在其中根据需要设置所有内容,然后启用构建日志记录,进行构建并分析所有命令及其参数的构建日志。