我已经做下约20年,但我从来没有建立了一个DLL; 我总是者优先静态链接。
我使用命令行 - cl.exe时,等等 - 和gnumake的makefile文件,建立我的Windows应用程序。
现在我想建立一个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
原来,它会自动发生。
如果您已导出功能(例如/导出,__declspec(dllexport)的,等等)的连接器会自动生成的.lib文件(你当然需要链接器命令行上/ DLL)。
Simlar到Ebow哈尔姆的答案,但使用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
参考文献:
- https://msdn.microsoft.com/en-us/library/34c30xs1.aspx
- https://msdn.microsoft.com/en-us/library/19z1t1wy.aspx
CL是否需要任何额外的参数,以表明它是一种编译一个DLL? (我知道DLL导出原型需要__declspec(dllexport)的)。
事实上,自WIN3X走了,现在你只只需要或者__declspec(dllexport)
或定义你想导出的符号的名称.def文件。 .def文件允许您与修改名称导出符号,所以它仍然可以在特殊情况下非常有用。
我知道链接需要/ DLL作为参数。
是的。
我将运行lib和链接,产生的.lib分别.dll或将链接产生两者兼而有之?
LIB仅用于创建静态库(或.objs添加到您的IMPLIB)链接将同时生产一个.dll并为其导入的.lib。
找出最简单的方法就是让你在那里,只要你想设置一切MSVC项目,然后启用日志记录生成,使构建和分析buildlog所有的命令及其参数。