我应该用/ MD还是/ MT编译?
在Visual Studio中,有编译标志/ MD和/ MT,可以让您select所需的C运行时库。
我了解实施中的差异,但我仍不确定使用哪一个。 有什么优点/缺点?
我听说的/ MD的一个好处是,这允许有人更新运行时(如可能补丁安全问题),我的应用程序将受益于此更新。 虽然对我来说,这几乎看起来像一个非function:我不希望人们更改我的运行时间,而不允许我testing新版本!
我很好奇的一些事情:
- 这将如何影响构build时间? (大概是/ MT有点慢?)
- 还有什么其他的影响?
- 大多数人使用哪一个?
通过dynamic链接/ MD,
- 你接触到系统更新(好或坏),
- 你的可执行文件可能会更小(因为它没有内置的库),和
- 我相信至less在所有正在使用它的进程之间共享DLL的代码段(减less所消耗的RAM总量)。
我还发现,在实践中,当处理使用不同运行时选项构build的静态链接第三方二进制库时,主应用程序中的/ MT比/ MD更容易导致冲突(因为您如果C运行时被多次静态链接,特别是如果它们是不同的版本,会遇到麻烦。
如果你正在使用DLL,那么你应该去dynamic链接的CRT(/ MD)。
如果您使用dynamicCRT为您的.exe和所有.dll,那么他们将共享一个CRT的实现 – 这意味着他们将共享一个CRT堆,并分配在一个.exe / .dll内存可以释放另一个。
如果你的.exe文件和所有的.dll文件都使用了静态CRT,那么他们将得到一个单独的CRT副本 – 这意味着他们都将使用自己的CRT堆,所以内存必须在同一个模块中释放被分配。 你还会遇到代码膨胀(CRT的多个副本)和额外的运行时间开销(每个堆从操作系统分配内存来跟踪其状态,并且开销可能是显而易见的)。
我相信通过Visual Studio构build的项目的默认值是/ MD。
如果使用/ MT,则可执行文件将不依赖目标系统上存在的DLL。 如果你把这个包装在一个安装程序中,它可能不会是一个问题,你可以去任何方式。
我自己使用/ MT,这样我就可以忽略整个DLL的混乱。
PS Fooz先生指出,保持一致至关重要。 如果您正在链接其他库,则需要使用与其他库相同的选项。 如果您使用的是第三方DLL,几乎可以确定您需要使用运行时库的DLL版本。
我更喜欢静态链接到/ MT。
即使你使用/ MD获得了一个更小的可执行文件,你仍然需要发布一大堆DLL来确保用户获得正确的版本来运行你的程序。 最后,你的安装程序会比使用/ MT连接时更大。
更糟糕的是,如果您select将运行时库放在Windows目录中,用户迟早会安装一个带有不同库的新应用程序,如果运气不好,可能会破坏您的应用程序。
使用/ MD遇到的问题是,CRT的目标版本可能不在您的用户计算机上(特别是如果您使用最新版本的Visual Studio,并且用户具有较旧的操作系统)。
在这种情况下,你必须弄清楚如何把正确的版本放到他们的机器上。
从http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx :
/ MT定义_MT,以便从标准头文件(.h)中selectmultithreading特定版本的运行时例程。 此选项还会导致编译器将库名称LIBCMT.lib放入.obj文件,以便链接器将使用LIBCMT.lib来parsing外部符号。 / MT或/ MD(或其debugging等价物/ MTd或/ MDd)是创buildmultithreading程序所必需的。
/ MD定义_MT和_DLL,以便从标准的.h文件中selectmultithreading和DLL特定版本的运行时例程。 此选项还会导致编译器将库名称MSVCRT.lib放入.obj文件中。
使用此选项编译的应用程序静态链接到MSVCRT.lib。 这个库提供了一个允许链接器parsing外部引用的代码层。 实际的工作代码包含在MSVCR71.DLL,它必须在运行时可用于与MSVCRT.lib链接的应用程序。
当/ MD与定义的_STATIC_CPPLIB(/ D_STATIC_CPPLIB)一起使用时,它将导致应用程序链接到静态multithreading标准C ++库(libcpmt.lib)而不是dynamic版本(msvcprt.lib),同时仍然通过dynamic链接到主CRT MSVCRT.LIB。
所以,如果我正确地解释它,那么/ MTdynamic链接静态链接和/ MD链接。
如果您正在构build使用其他dll或libs的可执行文件比/ MD选项是首选的,因为这样所有的组件将共享相同的库。 当然,这个选项应该适用于所有涉及的模块,即dll / lib / exe。
如果您的可执行文件不使用任何lib或dll比任何人的电话。 现在的差别不是太大,因为分享方面没有发挥作用。
所以,也许你可以用/ MT启动应用程序,因为没有任何强制性的理由,但是当它添加一个lib或者dll的时候,你可以用lib / dll来更改/ MD,这很容易。