如何在不依赖于C运行时的情况下创建Win32 DLL
使用Visual Studio 2008及其C / C ++编译器,如何创建仅依赖于其他Windows DLL的Win32 DLL,并且不依赖于Microsoft C运行时?
我有一些C代码,我想放在一个完全计算的DLL中,几乎不使用C库函数。
对于它确实使用的那些(例如memcpy),我很乐意重新编写代码以使用Win32 API等价物(例如CopyMemory)。
使用/ NODEFAULTLIB链接器选项(当然)确保您没有对运行时的实际依赖性。 您还必须使用/ ENTRY链接器选项指定和定义自己的DLL入口点,或者使用您自己的入口点函数来匹配编译器/链接器所期望的名称(对于dll,即_DllMainCRTStartup
)。
Matt Pietrek在LIBCTINY上的文章可能会提供您需要的所有信息:
您可能比您想象的更多依赖CRT。 它消除了线程本地存储等资源,并且在main()之前由CRT运行全局类初始化器。
正如有人所说,考虑使用静态CRT进行链接,如果你真的不想这样做,请像其他人所说的那样使用/ NODEFAULTLIB和/ ENTRY。
哦,而不是重新编写 memcpy,考虑使用内在的超快编译器 。 您可以使用/ Oi启用内在函数。
对于“调试”模式,试试这个:
- 转到Project \ [Projectname]属性…
- 打开配置属性
- 打开C / C ++
- 开放代码生成
- 对于运行时库选择multithreading调试(/ MTd)而不是multithreading调试DLL(/ MDd)
对于“释放”模式,除了在最后一步中选择multithreading(/ MT)之外,执行相同的步骤。
这会导致程序中使用的任何C运行时函数静态链接到二进制文件。
/NODEFAULTLIB
链接器标志实际上不是正确的标志。 它将忽略所有默认库,包括uuid.lib
等其他uuid.lib
。
你想要的是/Zl
编译器选项,“省略.OBJ中的默认库名称”。
您必须确保您使用的Win32 DLL都不需要C运行时,否则您需要返回第一个。 如果其中一个Win32 DLL依赖于C运行时,静态编译DLL将无关紧要。
我能看到这个工作的唯一方法是将所有依赖的DLL(如果可行的话)静态链接到DLL中。 这当然意味着您必须重新编译才能利用任何DLL更新。
一些Windows库依赖于C运行时(例如ODBC32.DLL),所以我认为你在这里隐藏着什么。 无论如何,你为什么要这样做呢?
用静态microsoft lib编译它。