手上是一个编码器+网络的应用,我的工程依赖编码器静态库xxx.lib
编码器的静态库由异地同事开发,链接单线程C库(libcd之类) 我这边是多线程工程,
链接时碰到一处警告说libcd和多线程版本冲突,/NODEFAULTLIB:"LIBC" /NODEFAULTLIB:"LIBCD"忽略了
(我当然直接问他要多线程版本,但是对方认为编译过了属于没问题= =!,说出问题了再说吧,我估计可能对方是考虑性能,其实真出了问题的话,这种问题一定会隐藏很深,岂能随便定位到的?不过作为新员工,不便多说是非)然后编译出现了奇怪的问题 
这个库必须加在source file下 而不能#pragma comment(lib, "xxx.lib") 
否则是"LINK : fatal error LNK1196: invalid or corrupt import object: unknown version"
检查链接详情,发现加在工程文件视目录source file下,xxx.lib中有一个符号是首先被链接器定位的,
而在stdafx.h中写pragma,则这个符号是随后才被定位,而导致LNK1196现在是加在source file下凑合着过,我想问大大们,有没有因为链接多个C库,后来用开关忽略一个而引起过实际的问题?或者说,这种威胁是否真的存在?谢谢!300奉上。

解决方案 »

  1.   

    除了 内存申请释放会有问题,运行时库的全局变量,运行时库的初始化,结构定义会有隐患,其他的就没有什么大问题了,而且这些问题出了,一般也不好查,不在自己的代码逻辑里.最好是用同一个机器的同一个编译环境,Rebuild all,出发布版.
      

  2.   

    如果对方提供的库是可以重入的那么,你忽略了libcd库,基本不会有什么问题。
    如果对方提供的库是不可以重入的,但是你的用法已经用同步行为保护了它的库函数,那么,你忽略了libcd库也基本不会有什么问题。但是如果对方提供的库是不可以重入的,你的用法也没考虑多线程保护的问题,那么这个时候忽略了libcd库可能会有隐藏的问题。
      

  3.   

    我是忽略了libcd才过的 不然就会警告 如果我和他用同一个库(都用单线程版本的C库) 我也怕啊 我自己是多线程的程序,搞不好就同时调用C库函数的。嗯 只能凑合着用了
      

  4.   

    libcd.lib是单线程的静态库
    2005里已经把多线程的库和单线程的库合一了,是libcpmt.lib
    忽略libcd,用libcpmt.lib
      

  5.   

    运行库不一致,当不同module(dll,exe)之间传递参数,如果有vector等STL类型时,会引起一些无法预测的问题(曾经碰到过这么一个奇怪的问题。)所以最好的做法,自然是同样的编译器版本,同样的运行时库等,这样问题可以避免很多