Windows DLL如何链接到MSVC运行时

问题描述

| 好的,让我以这种方式提出我的问题。 有两种方法可以在VC ++中编译我们的库(我们的输出库类型) 1)一个dll 2)一个lib 类似地,有两种方法可以定义如何添加其他系统库(我们如何编译该库): 1)使用_MD(这将确保我们的项目将与msvcrt.dll链接) 2)使用_MT(这将确保我们的项目将与libcmt.dll链接) 我只是想了解“我们的输出库类型”和“我们如何编译该库”之间是否存在任何关联。 例如,如果我将我的库编译为dll但将选项指定为_MT,它是否可以正常工作(在编译后)? 同样,如果我将库编译为lib(static)并提供选项_MD,它将正常运行吗?如果是,则哪个系统库(无论是msvcrt.dll还是libcmt.dll)都与此关联。 如果我仍然不清楚我的问题,请告诉我。     

解决方法

因为我认为VC6,所以Visual C ++尚未将代码与
MSVCRT.DLL
(OS文件)链接。 从那时起,所有版本都提供了自己的C和C ++运行时库,与操作系统分开,例如MSVCRT90.DLL与您的VC2008标记匹配。 应用程序或DLL项目都可以使用静态链接或作为DLL的运行时库。没有“ 1”,因为静态链接不涉及单独的DLL。
libcmt.lib
中的代码包含在您的.EXE或.DLL中。 现在,正常工作完全是另一回事。我不建议对C ++类使用
dllexport
,也不要在与分配它不同的模块中释放内存,但是如果您的代码确实如此,则必须使用
/MD
并分发DLL。否则,应用程序的每个模块都将具有运行时库的单独副本,该库的对象和内存管理器将不可互换。我不建议这样做的原因是因为应用程序的所有模块还必须使用相同的编译器版本和选项进行编译...当您拥有两个第三方DLL并且编译器版本没有此功能时,这真的很糟糕。他们之间不匹配。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...