/MD、/MT、/LD( 使用 多线程版本 运行时库底C runtime library)

Visual C++ 编译器选项 /MD、/ML、/MT、/LD 区别

点名同您种连续的运行期库 
/MT多线程应用程序 
/Mtd多线程应用程序(DEBUG) 
/MD多线程DLL 
/MDd多线程DLL(DEBUG)

 

 

 

前段时间编译一个引用自己写的静态库的主次时一直是出新链接时之大多只再定义的谬误,而温馨之代码明明没重定义这些事物,譬如:
LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined
in libc.lib(_file.obj)
LIBCMT.lib(_file.obj) : error LNK2005: ___endstdio already defined
in libc.lib(_file.obj)
LIBCMT.lib(_file.obj) : error LNK2005: __cflush already defined in
libc.lib(_file.obj)
LIBCMT.lib(_file.obj) : error LNK2005: __iob already defined in
libc.lib(_file.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __alloc_osfhnd already
defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __set_osfhnd already defined
in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __free_osfhnd already
defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __get_osfhandle already
defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __open_osfhandle already
defined in libc.lib(osfinfo.obj)
LIBCMT.lib(tolower.obj) : error LNK2005: __tolower already defined in
libc.lib(tolower.obj)
LIBCMT.lib(tolower.obj) : error LNK2005: _tolower already defined in
libc.lib(tolower.obj)
等等。

所 以起估计是编译器的题目,通过网上搜以及查msdn,原来是Visual C++
编译器选项的关于单线程或多丝总长运行时例程的题材:我的好静态库编译时/ML单线程版本的,而引用它的次是/MT多线程版本的,他们于编译分别讲
libc.lib和LIBCMT.lib连接受各自的代码中,估计libc.lib和LIBCMT.lib只是单线程与大多线程的分,基本代码相差无几,
所以会发出链接时更定义错误;然后把编译静态库的选取项/ML改化/MT就没事了。

假设注意的是:/MD也是多线程版本的;被应用之用户链接库
要和应用者有同等的编译选项,/MD与/MT一起有时候会起错的,有时候就算无,我碰过这种状态;而/MD和/ML似乎是从来不问题的;/MT和/ML是
肯定会发生题目之。有没有来其它情况就算不懂得了,有趣味之足测试一下,^_^

若果是代码是用来多线程的,最好编译成多线程版本的,否则恐怕会见出现部分意料之外的问题。

编译器选项设置(vc6):工程 -> 设置 -> C/C++ -> 工程选项  
里好修改

附:

脚是msdn关于Visual C++ 编译器选项的辨证:

这些选择选择单线程或多丝总长运行时例程,指示多线程模块是否也
DLL,并精选运行时库底颁布版要调试版本。

选项 说明 
/MD 定义 _MT 和 _DLL 以便同时起专业 .h
文件中摘运行时例程的多线程特定版本与 DLL
特定版本。此选项还而编译器将仓库名 MSVCRT.lib 放入 .obj 文件被。 
因此这个选项编译的应用程序静态链接到
MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在
MSVCR71.DLL 中,该库必须以运转时对于和 MSVCRT.lib 链接的应用程序可用。

当 在概念了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的图景下行使 /MD
时,它用造成应用程序通过静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本
(msvcprt.lib) 进行链接,同时按透过 msvcrt.lib 动态链接到主 CRT。

/MDd 定义 _DEBUG、_MT 和 _DLL,以便从规范 .h
文件被甄选运行时例程的调剂多线程特定版本与 DLL
特定版本。它还而编译器将仓库名 MSVCRTD.lib 放入 .obj 文件中。 
/ML 使编译器将仓库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib
解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。 
/MLd 定义 _DEBUG 并设编译器将仓库名 LIBCD.lib 放入 .obj
文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib
不提供多线程支持。 
/MT 定义 _MT, 以便从正式头 (.h)
文件被甄选运行时例程的多线程特定版本。此选项还使编译器将仓库名 LIBCMT.lib
放入 .obj 文件被,以便链接器使用 LIBCMT.lib
解析外部符号。创建多线程程序用 /MT 或 /MD(或其的调节等效选项 /MTd
或 /MDd)。 
/MTd 定义 _DEBUG 和 _MT。定义 _MT 会导致从规范 .h
文件中选择运行时例程的多线程特定版本。此选项还而编译器将仓库名 LIBCMTD.lib
放入 .obj 文件中,以便链接器使用 LIBCMTD.lib
解析外部符号。创建多线程程序需要 /MTd 或 /MDd(或她的非调试等效选项
/MT 或 MD)。 
/LD 创建 DLL。 
用 /DLL 选项传递及链接器。链接器查找 DllMain
函数,但并不需要该函数。如果没有编制 DllMain 函数,链接器将插入返回 TRUE
的 DllMain 函数。

链接 DLL 启动代码。

若果命令执行及不指定导出 (.exp) 文件,则创造导入库
(.lib);将导入库链接到调用您的 DLL 的应用程序。

拿 /Fe 解释也命名 DLL 而无是 .exe 文件;默认程序名为改成基名称.dll
而休是基名称.exe。

要是还无显式指定 /M 选项有,则用默认运行时库支持更改为 /MT。

/LDd 创建调试 DLL。定义 _DEBUG。

警戒   
不要混合使用运行时库底静态版本及动态版。在一个进程中有多独运行时库副本会导致问题,因为副本中的静态数据不跟其余副本共享。链接器禁止在
.exe
文件之中既使静态版本又使动态版链接,但若照可行使运行时库的有限个(或重复多)副本。例如,当与用动态
(DLL) 版本的运作时库链接的 .exe 文件共使用时,用静态(非
DLL)版本的运行时库链接的动态链接库可能造成问题。(还应避免在一个进程中夹使用这些库的调剂版本与非调试版本)。
关于以运行时库的调节版本的再次多信息,请参见运行时库参考。

知识库文章 Q140584 也讨论哪边选适宜的 C 运行时库。

有关 DLL 的尤其讨论,请参见 DLL。

每当 Visual Studio 开发条件被安装这个编译器选项