Windows DLL如何链接到MSVC运行时

时间:2011-05-25 17:53:16

标签: visual-studio-2008 winapi

好的,让我以这种方式提出我的问题。 有两种方法可以在VC ++中编译我们的库(我们的输出库类型) 1)一个DLL 2)一个lib

同样,我们可以通过两种方式定义如何添加其他系统库(我们如何编译该库): 1)使用_MD(这将确保我们的项目将与msvcrt.dll链接) 2)使用_MT(这将确保我们的项目将与libcmt.dll链接)

我只想了解“我们的输出库类型”和“我们如何编译该库”之间存在任何关联。 例如,如果我将我的库编译为dll,但将选项作为_MT,它是否正常工作(编译后)?如果是,则系统库(无论是msvcrt.dll还是libcmt.dll)将与此相关联。 同样,如果我将我的库编译为lib(静态)并给出选项_MD,它会正常工作吗?如果是,那么哪个系统库(无论是msvcrt.dll还是libcmt.dll)都会与此相关联。

让我知道如果我仍然不清楚我的问题。

1 个答案:

答案 0 :(得分:3)

Visual C ++没有将代码与MSVCRT.DLL(操作系统文件)联系起来,因为我认为是VC6。

此后的所有版本都提供了自己的C和C ++运行时库,这些库与操作系统分开,例如: MSVCRT90.DLL与您的VC2008标记匹配。

应用程序或DLL项目可以使用静态链接的运行时库或DLL。没有libcmt.dll,因为静态链接不涉及单独的DLL。 libcmt.lib中的代码包含在.EXE或.DLL中。

现在,正常工作完全是另一回事。我不建议将dllexport与C ++类一起使用,或者在不同的模块中释放内存而不是分配它,但是如果你的代码那么你必须使用/MD并分发DLL。否则,应用程序的每个模块都将具有运行时库的单独副本,其对象和内存管理器将不可互换。我不推荐这个的原因是因为应用程序的所有模块也必须使用相同的编译器版本和选项进行编译...当你有两个第三方DLL并且编译器版本不匹配时,这真的很糟糕他们之间。