首页
社区
课程
招聘
[求助]windows的下静态库 *.lib 文件是否是已被链接好的文件?
2015-5-21 13:02 6334

[求助]windows的下静态库 *.lib 文件是否是已被链接好的文件?

2015-5-21 13:02
6334
如:VC6.0控制台程序 调用MFC 的 CFile 为什么出现“unresolved external symbol __endthreadex”?

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
控制台程序调用CFile类 发生该错误的根本原因是什么?

控制台程序默认使用单线程运行库,mfc静态库nafxcwd.lib使用多线程运行库。
为什么会提示找不到__endthreadex ?

有两个问题,
一、看这里出现的错误,似乎静态库lib本身并没有被链接,而是当EXE文件被链接时才一并链接静态库,对吗?

二、如果一成立,那么为什么nafxcwd.lib指定的多线程运行库没有被链接进来?

很疑惑,静态库lib 自身究竟是什么时候被链接的呢?静态库编译时,还是EXE编译时。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 1412
活跃值: (4229)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2015-5-21 14:13
2
0
设置里面多线程 多线程调试  /MTD /MT那里都设置一下编译看看。
雪    币: 23
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Dormi 2015-5-21 14:30
3
0
这个我知道怎么解决,就是不明白lib静态库自身编译时,lib自身是怎样链接到crt的疑问上,以及什么时候链接。
雪    币: 23
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Dormi 2015-6-1 09:59
4
0
问题已经解决了,自己做个记录:
1、静态库的lib文件在自身构建时并不会被链接,其内是一大堆obj文件的集合,其实就是Cpp&函数集合(里面不会链接其它的lib库函数,甚至连需要链接哪些库的库文件名都没有)。
2、一个静态库可以引用另一个静态库,但是链接EXE/DLL时,必须同时引入所有用到的静态库进行链接(包括静态库所引用的静态库),链接器会搜索每个静态库中需要的外部符号,并去其它库中搜索。
3、为什么在VS下,EXE依赖于一个静态库LIB项目时会报该CRT冲突错误,而网上下载的lib库加入到程序后却不会有该冲突? 因为,在VS下一个工程所引用的库信息全部和工程相关,而这个EXE/DLL工程依赖于另一个LIB工程时,VS会在EXE/DLL工程中自动包含所有lib,这些lib中也包括依赖项目的lib,以及依赖项目所依赖的lib,以保证最大化的避免在编译主工程时缺少子工程的lib库而链接失败的问题,所以主工程本身引入了CRT,子工程也引入了CRT,那么主工程依赖于子工程时,就会产生冲突。
而网上下载的静态库则是一个单纯的*.lib文件,非工程形式,所以不会附带工程的特性(也就是这个lib依赖于哪些其他lib,或者crt的lib),因此不会产生冲突问题。
雪    币: 144
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ProbieTmp 2015-6-1 10:12
5
0
楼主遇到问题,解决问题后,又把解决方法分享出来的精神值得学习,不像有些人.解决了,就一句话解决了.实在不知道那种帖子存在的意义.`
游客
登录 | 注册 方可回帖
返回