在Visual Studio中,有编译标志/ MD和/ MT,可让您选择所需的C运行时库。
我了解实现上的区别,但仍不确定要使用哪个。优点/缺点是什么?
我听说过的/ MD的一个优点是,它允许某人更新运行时(例如修补安全问题),并且我的应用程序将从此更新中受益。尽管对我而言,这似乎是一个无功能:我不希望人们在不让我针对新版本进行测试的情况下更改运行时!
我有些好奇的事情:
- 这将如何影响构建时间?(大概/ MT慢一点?)
- 还有哪些其他含义?
- 大多数人使用哪一个?
在Visual Studio中,有编译标志/ MD和/ MT,可让您选择所需的C运行时库。
我了解实现上的区别,但仍不确定要使用哪个。优点/缺点是什么?
我听说过的/ MD的一个优点是,它允许某人更新运行时(例如修补安全问题),并且我的应用程序将从此更新中受益。尽管对我而言,这似乎是一个无功能:我不希望人们在不让我针对新版本进行测试的情况下更改运行时!
我有些好奇的事情:
Answers:
通过与/ MD动态链接,
我还发现,在实践中,当使用通过不同的运行时选项构建的静态链接的仅第三方的二进制二进制库时,主应用程序中的/ MT往往比/ MD引起冲突的频率更高(因为如果C运行时多次静态链接(特别是它们的版本不同),则会遇到麻烦。
/MT
运行时会稍微快一点,因为您的应用程序不需要每次都搜索运行时函数的实现,我不是这个级别的专家,但是我可以肯定大多数操作系统将缓存运行时实现,因此您的应用程序将使用缓存的版本,因此差别不会那么大。请注意,我提到我不确定,因此请勿将此注释作为参数。
我更喜欢与/ MT静态链接。
即使使用/ MD获得了较小的可执行文件,您仍然必须附带一堆DLL,以确保用户获得用于运行程序的正确版本。最后,与/ MT链接相比,您的安装程序将更大。
更糟糕的是,如果您选择将运行时库放置在Windows目录中,则用户迟早会使用不同的库安装新的应用程序,如果运气不好,则会破坏您的应用程序。
来自http://msdn.microsoft.com/zh-cn/library/2kzt1wy3(VS.71).aspx:
/ MT定义_MT,以便从标准标头(.h)文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名称LIBCMT.lib放入.obj文件,以便链接程序将使用LIBCMT.lib解析外部符号。创建多线程程序需要/ MT或/ MD(或其调试等效项/ MTd或/ MDd)。
/ MD定义_MT和_DLL,以便从标准.h文件中选择运行时例程的多线程和DLL特定版本。此选项还使编译器将库名称MSVCRT.lib放入.obj文件。
使用此选项编译的应用程序静态链接到MSVCRT.lib。该库提供了一层代码,允许链接程序解析外部引用。实际的工作代码包含在MSVCR71.DLL中,该文件必须在运行时可用于与MSVCRT.lib链接的应用程序。
当/ MD与定义的_STATIC_CPPLIB(/ D_STATIC_CPPLIB)一起使用时,它将导致应用程序与静态多线程标准C ++库(libcpmt.lib)而非动态版本(msvcprt.lib)链接,同时仍通过msvcrt.lib。
因此,如果我正确地解释了它,那么/ MT静态链接而/ MD动态链接。