如何在不依赖于C运行时的情况下创建Win32 DLL

时间:2009-08-14 18:04:35

标签: c++ c winapi dll

使用Visual Studio 2008及其C / C ++编译器,如何创建仅依赖于其他Windows DLL的Win32 DLL,并且不依赖于Microsoft C运行时?

我有一些C代码,我想放在一个完全是计算的DLL中,几乎不使用C库函数。

对于那些确实使用的人(例如memcpy),我很乐意重新编写代码以使用Win32 API等价物(例如CopyMemory)。

7 个答案:

答案 0 :(得分:10)

使用/ NODEFAULTLIB链接器选项(当然)确保您没有对运行时的实际依赖关系。你还必须指定&使用/ ENTRY链接器选项为DLL定义您自己的入口点,或者使用您自己的入口点函数来匹配编译器/链接器所期望的名称(对于dll,即_DllMainCRTStartup)。

Matt Pietrek在LIBCTINY上的文章可能会提供您需要的所有信息:

答案 1 :(得分:5)

您可能比您想象的更多依赖CRT。它消除了线程本地存储等资源,全局类初始化器由main()之前的CRT运行。

正如有人所说,考虑使用静态CRT进行链接,如果你真的不想这样做,请像其他人所说的那样使用/ NODEFAULTLIB和/ ENTRY。

哦,而不是重新编写memcpy,考虑使用超快compiler intrinsic。您可以使用/ Oi打开内在函数。

答案 2 :(得分:5)

for“Debug”模式试试这个:

  1. 转到项目\ [项目名称]属性...
  2. 打开配置属性
  3. 打开 C / C ++
  4. 打开代码生成
  5. 对于运行时库选择多线程调试(/ MTd)而不是多线程调试DLL(/ MDd)
  6. 对于“发布”模式,除了在最后一步选择多线程(/ MT)外,执行相同的步骤。

    这会导致程序中使用的任何C运行时函数静态链接到二进制文件。

答案 3 :(得分:4)

/NODEFAULTLIB链接器标志实际上不是正确的标志。它将忽略所有默认库,包括uuid.lib等其他库。

你想要的是/Zl编译器选项,“省略.OBJ中的默认库名称。”

答案 4 :(得分:1)

您必须确保您使用的Win32 DLL都不需要C运行时,否则您需要返回第一个。如果其中一个Win32 DLL依赖于C运行时,静态编译DLL将无关紧要。

我能看到这个工作的唯一方法是将所有依赖的DLL(如果可行的话)静态链接到DLL中。这当然意味着您必须重新编译才能利用任何DLL更新。

答案 5 :(得分:0)

某些Windows库依赖于C运行时(例如,ODBC32.DLL)  所以我觉得你在这里隐藏着什么。无论如何,你为什么要这样做?

答案 6 :(得分:0)

使用static microsoft lib编译它。