打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
(转帖)Visual C++ 编译器选项 /MD、/ML、/MT、/LD 区别 - 樱空释...

好久没有更新日志了,最近收获还是有的。。。。呵呵转个帖子作为一个新的开始吧。

2009-5-31日今天是个有纪念意义的小日子啊,我决定减肥了,以前总是轻易的放纵自己,没有动力去完成这个被称为女人需要为之奋斗一生的“光荣事件”---减肥。毕竟之前闲云野鹤的日子一个人,一杯水,一顿饱饭,一个淡然的日月,很潇洒不需要为其他的东西烦心,毕竟只要自己觉得开心就可以了。恋爱了,逗逗也是没有什么美丑观念的人儿~,平平淡淡的生活认认真真的彼此依靠幸福对我们已经足够了,所以虽然周围一片唏嘘我还是依然默默地“膨胀”着,也许很多时候看到照片啊,或者让背背啊,或者看到漂亮的衣饰啊,或者看到sexy的美女啊。。。会对自己体型的横向发展有所顾虑和烦心,但是奈何天生的神经大条,情绪乐观,也都不了了之,而且对于能不能减下去一直没有信心,所以日子也就这么过着了。也许您会觉得那5月31日我是不是受到什么沉重打击了才会这么坚定的想进行这个事业呢~呵呵也不是~我一向就是这么随性的一个人,突然想到了,也突然想尝试了而已,也许这就是传说中的顿悟吧,反正我是决定这么做了,别以为这样的“决心”很无聊什么的,我会尽量从今天开始记录下,我的减肥日记,一句话----有志者事竟成!

今天仅仅是一个开始,加油!SooLeal! 早上7:30分3圈小花园!预定晚上4圈~~^_^ 逗逗看我的咯~~

 

废话完毕,以下转帖~~

 

 

指定与你项目连接的运行期库

/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 开发环境中设置此编译器选项

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VS中的 MD/MT设置
为什么会出现LNK2005"符号已定义"的链接错误?
/nodefaultlib:"LIBCMT.lib"
你所不知道的C和C++运行库
VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
MT、MTd、MD、MDd
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服