MSVCRTD.lib
代码调试过程中,挂在基本库函数中,需要考虑是否缺失MSVCRTD.lib等系统库。
当遇到MSVCRTD.LIB和LIBCMTD.LIB的冲突时,一般是因为代码编译时代码生成选择c/c++的运行库版本不一致;
博文出处:http://blog.csdn.net/rankun1/article/details/51026117
于是搞明白了MT,MTd,MD,MDd的区别,问题出现的根源算是明白了。(libc.lib找不到也可以在这里找到答案)
先用简单的方式概括一下原因:
项目-属性-c/c++-代码生成-运行库的选择
选择 MT会用到LIBCMT.LIB MTD会用到LIBCMTD.LIB
选择 MD会用到MSVCRT.LIB MDD会用到MSVCRTD.LIB
如果你使用的库用的MT,你自己的程序为MD,则会发生MSVCRTD.LIB和LIBCMTD.LIB的冲突(debug)或者MSVCRT.LIB和LIBCMT.LIB的冲突(release)
解决方法可以保持库编译版本的一致,如果无法保证,就使用终极大招
项目-属性-链接器-命令行-附加参数加入 /FORCE:MULTIPLE
这个参数会自动忽略重复定义
注意:项目-属性-配置属性-常规-MFC的使用,这一选项,
如果选择了在静态库中使用MFC,则代码生成时只能选择MT(Release)或者MTd(Debug)
如果选择了在共享的DLL中使用MFC则,代码生成时只能选择MD(Release)或者MDd(Debug)
这里总结下他们的区别,后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了。
为了防止不同运行库导致的库冲突,需要就行忽略
版 本 | 类 型 | 使用的library | 被忽略的library |
R Release | 单线程 | libc.lib | libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
多线程 | libcmt.lib | libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib | |
使用DLL的多线程 | msvcrt.lib | libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib | |
D Debug | 单线程 | libcd.lib | libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib |
多线程 | libcmtd.lib | libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib | |
使用DLL的多线程 | msvcrtd.lib | libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib |
遇到libc.lib找不到是因为它是单线程用到的库,而单线程在VS2003以后就被微软取消了,所以老版本的用单线程编译的库就提示libc.lib找不到错误,
你可以在忽略特定库中忽略它,或者去vc6找一个包含进来,
下面进行详细讲解:
/MT是 "multithread, static version ” 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib 安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号。
/MD是 "multithread- and DLL-specific version” ,意思是多线程DLL版本,定义了它后,编译器把
MSVCRT.lib 安置到OBJ文件中,它连接到DLL的方式是静态链接,实际上工作的库是MSVCR80.DLL。
即:
静态运行时库:LIBCMT.lib
动态运行时库:MSVCRT.lib +MSVCR80.DLL
所以,当你用CMAKE生成工程文件时,若CMAKE是用/MT生成的(查看工程原始目录的CMakeLists.txt),则它所调用的运行时库为:LIBCMT.lib,若生成的工程的运行时库(Runtime Library)你选择/MD,则此工程在编译后链接的时候,将会调用动态运行时库:MSVCRT.lib +MSVCR80.DLL,明显,两次对同一个某运行时库里的函数调用的库不同,则会出现重定义的错误。若此工程生成的是库文件,则其他工程调用此库时也必须是/MT。
===============================================
VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)、单线程(/ML)、单线程调试(/MLd)。
ReusableLibrary Switch Library Macro(s) Defined
Single Threaded |
/ML |
LIBC |
(none) |
Static MultiThread |
/MT |
LIBCMT |
_MT |
Dynamic Link (DLL) |
/MD |
MSVCRT |
_MT and _DLL |
Debug Single Threaded |
/MLd |
LIBCD |
_DEBUG |
Debug Static MultiThread |
/MTd |
LIBCMTD |
_DEBUG and _MT |
Debug Dynamic Link (DLL) |
/MDd |
MSVCRTD |
_DEBUG, _MT, and _DLL |
其中以小写“d”结尾的选项表示的DEBUG版本的,没有“d”的为RELEASE版本。大型项目中必须要求所有组件和第三方库的运行时库是统一的,否则将会出现LNK2005井喷。
单线程运行时库选项/ML和/MLd在VS2003以后就被废了。
/MT和/MTd表示采用多线程CRT库的静态lib版本。该选项会在编译时将运行时库以静态lib的形式完全嵌入。该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的“Invalid Addressspecified to RtlValidateHeap”问题。另外托管C++和CLI中不再支持/MT和/MTd选项。
/MD和/MDd表示采用多线程CRT库的动态dll版本,会使应用程序使用运行时库特定版本的多线程DLL。链接时将按照传统VC链接dll的方式将运行时库MSVCRxx.DLL的导入库MSVCRT.lib链接,在运行时要求安装了相应版本的VC运行时库可再发行组件包(当然把这些运行时库dll放在应用程序目录下也是可以的)。 因/MD和/MDd方式不会将运行时库链接到可执行文件内部,可有效减少可执行文件尺寸。当多项目以MD方式运作时,其内部会采用同一个堆,内存管理将被简化,跨模块内存管理问题也能得到缓解。
结论:/MD和/MDd将是潮流所趋,/ML和/MLd方式请及时放弃,/MT和/MTd在非必要时最好也不要采用了。
MSVCRTD.lib相关推荐
- [转]关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...
关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决 转自:http://hi.baidu.com/qinfen ...
- VC2019无法打开文件msvcrtd.lib和Spectre 缓解库相关问题
VC2019工作正常:安装了驱动环境以后,构建一个VC程序,出现错误: MSB8038 已启用 Spectre 缓解,但找不到 Spectre 缓解库.验证 Visual Studio 工作负荷 ...
- MSVCRTD.lib(crtexe.obj) : error LNK2019
MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStart 中被引用 解决办法: 右键点击--&g ...
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...
转自:http://hi.baidu.com/qinfengxiaoyue/item/ff262ccfb53b4c2ba0b50a89 引自:http://blog.csdn.net/sptoor/a ...
- MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16
1.问题描述 做开源项目时,碰到VS2010报错如下: MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 _ ...
- mfcs100ud.lib(dllmodul.obj):error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义
mfcs100ud.lib(dllmodul.obj):error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义 简单地说,就是产生错误的 ...
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决
关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决 参考文章: (1)关于形如--error LNK2005: ...
- error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义
本文主要分析和解决编译链接时产生的 LNK2005 错误. [错误信息]: mfcs90ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 alread ...
- MSVCRTD.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 _main,函数 “int __cdecl invoke_main(void)“ (?invo
MSVCRTD.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 _main,函数 "int __cdecl invoke_main(void)&qu ...
最新文章
- php类属性命名驼峰还是下划线,PHP实现驼峰命名和下划线命名互转
- java try catch嵌套_try catch里面try catch嵌套
- McAfee----McAfee 2008 中文版
- ASP.NET配置错误页面浅析
- 误执行了rm -fr /*之后,除了跑路还能怎么办?!
- 一道有趣的最短路 NEERC2017 Journey from Petersburg to Moscow
- sql server 2005中的服务器角色[转]
- pymongo的使用 0916
- content:\2b 是什么意义
- 【Head First 设计模式】-简单工厂模式读后总结
- java数据类型double保留两位小数
- python井字棋如何判断输赢_python 井字棋游戏 简单版,不知道为什么不判断,用Tkinter做的界面...
- XPath 基本语法
- Android范围自定义,android – 如何在dagger 2.10中创建自定义范围模块
- 在C/C++中使用输入输出流
- java AES 32位加密解密
- Mysql 关联查询 索引失效
- FGSM论文阅读笔记
- SuperMap iServer整合第三方地图服务
- SAP系统开发里程碑 2022 刘欣