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

Joh*_*ely 8 c c++ dll winapi

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

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

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

Mic*_*urr 10

使用/ NODEFAULTLIB链接器选项(当然)确保您没有对运行时的实际依赖性.您还可以指定与使用/ ENTRY链接器选项定义自己的切入点DLL或备选地具有由编译器/连接器(一个DLL,那是预期名称相匹配自己的入口点函数_DllMainCRTStartup).

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

  • 我们可以依赖于机器上的MSVCRT.dll,但是Visual C++链接到MSVCRver.dll,其中ver是80,90,100,110等. (2认同)

Dre*_*ins 5

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

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

哦,而不是重新编写 memcpy,考虑使用内在的超快编译器.您可以使用/ Oi启用内在函数.


Isa*_*aac 5

对于"调试"模式试试这个:

  1. 转到Project\[Projectname]属性...
  2. 打开配置属性
  3. 打开C/C++
  4. 开放代码生成
  5. 对于运行时库选择多线程调试(/ MTd)而不是多线程调试DLL(/ MDd)

对于"释放"模式,除了在最后一步中选择多线程(/ MT)之外,执行相同的步骤.

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