error LNK2005 原理及解决办法

news/2024/12/29 17:28:13/

error LNK2005,解决办法

错误信息:

testLib.lib : error LNK2005:  已经在 msvcprtd.lib(MSVCP90D.dll) 中定义
libcpmtd.lib: error LNK2005: 已经在 msvcprtd.lib(MSVCP90D.dll) 中定义

发生情况:
test.exe调用静态库json_vc71_libmtd.lib时。
test.exe运行库选多线程 DLL (/MD),
testLib.lib运行库选的是多线程调试(/MT)。 会报此错误
原因:
因为工程同时连结了LIBCMTD.lib与MSVCRTD.lib.所以造成函数定义版本冲突。也就是说,程序连接器已经在一个CRT的版本中找到所需的函数定义,但此时又跳出另外一个CRT,也给了一份相同函数的实现版本,所以连接器无法判断应该忽略谁,并且选择谁。
静态运行时库:LIBCMTD.lib
动态运行时库:MSVCRTD.lib
解决方法:
a、使程序和要调用的库所选的运行库相同。
b、忽略冲突的库。

引发的思考

为了提高C语言的开发效率,C标准定义了一系列常用的函数,称为C库函数。C标准仅仅定义了函数原型,并没有提供实现。因此这个任务留给了各个支持C语言标准的编译器。每个编译器通常实现了标准C的超集,称为C运行时库(C Run Time Libray),简称CRT
VC++完美的支持C和C++标准,因此也就按照C和C++的标准定义的函数原型实现了上述运行时库。为了方便有不同需求的用户使用,VC++分别实现了动态链接库DLL版本和静态LIB版本。同时为了支持程序调试且不影响程序的性能,又分别提供了对应的调试版本。(VS项目属性中C/C++运行库 MT /MTd /MD /MDd)调试版本的名称在Release版本名称后添了字母d

/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

多线程(/MT):链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库集成到程序中成为程序中的代码,程序体积会变大。
多线程调试(/MTd):LIB的调试版。
多线程DLL(MD):使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无法运行。
多线程调试DLL(MDd):表示使用DLL的调试版

简单的说:
(1)/MD,表示运行时库由操作系统提供一个DLL,程序里不集成。
(2)/MT,表示运行时库由程序集成,程序不再需要操作系统提供运行时库DLL


http://www.ppmy.cn/news/691224.html

相关文章

解决 img标签 :src获取静态资源 图片无法显示

背景 我专门写了一个配置项js文件,用来存放data数据,如下,文件名为photographerList.js export default [// 摄影师{id: 0,avatr: ../images/photographers/xingyi.png,name: 邢小军,adress: 上海,price: 2800,introductionUrl: https://ww…

充电识别过程及QC2.0

一、BC1.2 1.Data Contact Decect DCD机制使用了向D提供的电流源Isp_src来检测PD连接host(SDP)后,数据信号的连接。 PD检测VBUS有效(>Votg_sess_vld).PD使能D上的电流源IDP_SRC和D-线上的下拉电阻Rdm_dwn.PD检测…

将GEE输出的影像批量导入指定的Google drive文件夹

参考的文章: 1.https://github.com/gee-hydro/gee_monkey 2.https://gis.stackexchange.com/questions/290771/batch-task-execution-in-google-earth-engine 需要将GEE处理好的影像输出,目前只在网上找到了批量输出到Google drive的教程,但…

走进音视频的世界——视频封装格式

音视频的时长怎么获取,音视频的封面怎么获取,音视频的格式怎么获取呢?这些信息都以特定格式存储在文件开头或者结尾,称为多媒体信息或者多媒体元数据。通用的封装格式由:文件标识头多媒体信息音视频(字幕)轨视频帧索引…

RTMP、RTSP、m3u8、flv 区别及含义

RTMP 与 RTSP 是比较常见的两种流媒体协议。 流媒体协议是一种用于通过 Web 传递多媒体的协议。 每次观看直播或点播视频时,背后的技术就是流媒体协议。 RTMP 英文全称:Real Time Messaging Protocol 中文意思:实时消息协议 底层协议&#xf…

夸克缓存视频合并小工具

原理 使用windows的命令行的copy命令来合并 copy /b 0123 new.ts 分析缓存目录结构,发现都是一个m3u8文件带一个同名文件夹 所以分析m3u8并把原来的路径换成这个缓存文件夹路径并按顺序合并即可。 其中碰到的难点是Qprocess在windows不好使,索性直接…

UC缓存的php格式视频,UC缓存视频变成本地mp4_下载视频怎么转换mp4_我的下载站

7条解答 1.uc缓存视频怎么转mp4 您好,很高兴为您服务! 安卓版的UC浏览器,缓存的为vdat,保存在UCDownloads/videodata这个文件夹里边,可以直接重命名让后将格式更改为mp4或者avi即可。 如果仍有问题,请您继续…

《无人机培训手册》样书及PDF部分内容

《无人机培训手册》样书 PDF部分内容