同一工程中链接不同的C库到底是否会有问题?除了编译时的问题?

an_bachelor 2010-04-01 11:16:49
手上是一个编码器+网络的应用,我的工程依赖编码器静态库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奉上。
...全文
161 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzy694358 2010-04-02
  • 打赏
  • 举报
回复
偶也是来接分的,
oyljerry 2010-04-02
  • 打赏
  • 举报
回复
运行库不一致,当不同module(dll,exe)之间传递参数,如果有vector等STL类型时,会引起一些无法预测的问题(曾经碰到过这么一个奇怪的问题。)

所以最好的做法,自然是同样的编译器版本,同样的运行时库等,这样问题可以避免很多
aa3000 2010-04-02
  • 打赏
  • 举报
回复
我承认,我进来是接分的
SullenSun 2010-04-02
  • 打赏
  • 举报
回复
libcd.lib是单线程的静态库
2005里已经把多线程的库和单线程的库合一了,是libcpmt.lib
忽略libcd,用libcpmt.lib。。。
SullenSun 2010-04-02
  • 打赏
  • 举报
回复
应该没什么问题。。
an_bachelor 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 akirya 的回复:]
链接过去就能说明,你跟他使用同一个库。就没有啥问题了。
[/Quote]我是忽略了libcd才过的 不然就会警告 如果我和他用同一个库(都用单线程版本的C库) 我也怕啊 我自己是多线程的程序,搞不好就同时调用C库函数的。

[Quote=引用 7 楼 wangk 的回复:]
如果对方提供的库是可以重入的那么,你忽略了libcd库,基本不会有什么问题。
如果对方提供的库是不可以重入的,但是你的用法已经用同步行为保护了它的库函数,那么,你忽略了libcd库也基本不会有什么问题。

但是如果对方提供的库是不可以重入的,你的用法也没考虑多线程保护的问题,那么这个时候忽略了libcd库可能会有隐藏的问题。
[/Quote]嗯 只能凑合着用了。。。
tingsking18 2010-04-02
  • 打赏
  • 举报
回复
能链接过去就可以了。!
SiGoYi 2010-04-01
  • 打赏
  • 举报
回复
先帮顶一下再看问题
lmxmx 2010-04-01
  • 打赏
  • 举报
回复
不明真相的群众路过,帮顶,并标记。
an_bachelor 2010-04-01
  • 打赏
  • 举报
回复
大家多指点啊 纯捧场也给分
Eleven 2010-04-01
  • 打赏
  • 举报
回复
帮顶。。。
wangk 2010-04-01
  • 打赏
  • 举报
回复
如果对方提供的库是可以重入的那么,你忽略了libcd库,基本不会有什么问题。
如果对方提供的库是不可以重入的,但是你的用法已经用同步行为保护了它的库函数,那么,你忽略了libcd库也基本不会有什么问题。

但是如果对方提供的库是不可以重入的,你的用法也没考虑多线程保护的问题,那么这个时候忽略了libcd库可能会有隐藏的问题。
  • 打赏
  • 举报
回复
链接过去就能说明,你跟他使用同一个库。就没有啥问题了。
jingzhongrong 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 visualassist4680 的回复:]

除了 内存申请释放会有问题,运行时库的全局变量,运行时库的初始化,结构定义会有隐患,其他的就没有什么大问题了,而且这些问题出了,一般也不好查,不在自己的代码逻辑里.

最好是用同一个机器的同一个编译环境,Rebuild all,出发布版.
[/Quote]

顶。
visualassist4680 2010-04-01
  • 打赏
  • 举报
回复
除了 内存申请释放会有问题,运行时库的全局变量,运行时库的初始化,结构定义会有隐患,其他的就没有什么大问题了,而且这些问题出了,一般也不好查,不在自己的代码逻辑里.

最好是用同一个机器的同一个编译环境,Rebuild all,出发布版.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧