如何在不依赖于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启用内在函数。

对于“调试”模式,试试这个:

  1. 转到Project \ [Projectname]属性…
  2. 打开配置属性
  3. 打开C / C ++
  4. 开放代码生成
  5. 对于运行时库选择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编译它。