lib文件有没有debug和release版本之分

陈丙雷 2010-03-02 10:43:36
兄弟姐妹们,lib文件有没有debug和release版本之分呢?如果我在程序的release版本中引用debug版本的lib文件,会不会有什么问题?谢谢各位指点下。
...全文
3244 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
杭州山不高 2012-08-02
  • 打赏
  • 举报
回复
Release和Debug当然有区别了
杭州山不高 2012-08-02
  • 打赏
  • 举报
回复
Debug和Release肯定有区别;)
但都可以用。
shawn 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]

一般debug版的lib是XXX_b.lib
release的是XXX.lib
请问有没有可能debug时候编出的是XXX.lib的呢?
[/Quote]

当然有可能,你自己可以命名。
只是空想家 2011-11-16
  • 打赏
  • 举报
回复
一般debug版的lib是XXX_b.lib
release的是XXX.lib
请问有没有可能debug时候编出的是XXX.lib的呢?
barech 2010-03-12
  • 打赏
  • 举报
回复
说实话,我确实糊涂了,不知道大家在吵些什么...


.lib是指静态链接库,而.LIB是指DLL用于隐式调用的引入库文件;

静态链接库当然区分debug与Release了;但是.LIB是否严格区分debug、release我就不知道了
WizardK 2010-03-10
  • 打赏
  • 举报
回复
引用 24 楼 sweepbonze 的回复:
引用 23 楼 nooning 的回复:
这由多方面决定的:
如果不使用API HOOK
DEBUG与RELEASE 只差性能,可以混用
但ANSI 与 UNICODE不能混用

最简单的例子,在release 的编译选项用 /MDd 在DEBUG里选 /MD

连接到mfc42.dll 还是mfc42d.dll 或mfcs42.dll都不会影响功能
但如果你ANSI版连接到mfc42u.dll那就等着出错吧,只要使用了ansi版函数

另一个就是如果使用hook,那么函数的行为会不一样,函数入口是一条jmp

说白了,DEBUG RELEASE 就是编译选项不一样,如果能导致等为不一样,那微软要关门

其它的区别仅限于,大小,生成的地址,而lib里不包括生成地址,只包括名称(静态库还有完整实现,但不连接)

如这位兄弟意思,也就是lib文件不管是动态库还是静态库,只要不是ANSI和UNICODE混用,是没多少区别的,是吗?


还在讨论。。。静态库99%的可能性不一样,动态库50%的可能性不一样,这都是要看你的设置的,DEBUG和RELEASE的编译选项和调用的库函数。

没任何前提的情况下,纯粹讨论是否一样有什么意义?你知道机理不就好了。
陈丙雷 2010-03-10
  • 打赏
  • 举报
回复
引用 23 楼 nooning 的回复:
这由多方面决定的:
如果不使用API HOOK
DEBUG与RELEASE 只差性能,可以混用
但ANSI 与 UNICODE不能混用

最简单的例子,在release 的编译选项用 /MDd 在DEBUG里选 /MD

连接到mfc42.dll 还是mfc42d.dll 或mfcs42.dll都不会影响功能
但如果你ANSI版连接到mfc42u.dll那就等着出错吧,只要使用了ansi版函数

另一个就是如果使用hook,那么函数的行为会不一样,函数入口是一条jmp

说白了,DEBUG RELEASE 就是编译选项不一样,如果能导致等为不一样,那微软要关门

其它的区别仅限于,大小,生成的地址,而lib里不包括生成地址,只包括名称(静态库还有完整实现,但不连接)


如这位兄弟意思,也就是lib文件不管是动态库还是静态库,只要不是ANSI和UNICODE混用,是没多少区别的,是吗?
必成桂 2010-03-10
  • 打赏
  • 举报
回复
当然,debug版和release版的编译选项是不一样的,出来的结果当然有区别。

debug带有调试信息,另外,没有经过优化,而且堆栈的结构和release版是有区别的。

nooning 2010-03-04
  • 打赏
  • 举报
回复 1
这由多方面决定的:
如果不使用API HOOK
DEBUG与RELEASE 只差性能,可以混用
但ANSI 与 UNICODE不能混用

最简单的例子,在release 的编译选项用 /MDd 在DEBUG里选 /MD

连接到mfc42.dll 还是mfc42d.dll 或mfcs42.dll都不会影响功能
但如果你ANSI版连接到mfc42u.dll那就等着出错吧,只要使用了ansi版函数

另一个就是如果使用hook,那么函数的行为会不一样,函数入口是一条jmp

说白了,DEBUG RELEASE 就是编译选项不一样,如果能导致等为不一样,那微软要关门

其它的区别仅限于,大小,生成的地址,而lib里不包括生成地址,只包括名称(静态库还有完整实现,但不连接)
lmxmx 2010-03-03
  • 打赏
  • 举报
回复
两者有区别

主要是代码的体积、效率、优化适度等不同,
但是实现的功能是一样的,
所以可以相互使用。

但是lib和dll最好是对应的版本,exe和lib则无所谓……
WaistCoat10 2010-03-03
  • 打赏
  • 举报
回复
副组长 2010-03-03
  • 打赏
  • 举报
回复
引用 20 楼 lisunlin0 的回复:
zhouzhipen,不要自以为是。----在VS的默认情况下,release和debug的lib是不一样的,debug带有调试信息,但Release不带,最明显的是文件的大小不一样。
    不过确实可以通过设置使debug和release版的lib几乎完全一样(但不包括时间戳等)。

你说的事静态库吧,人家说的是DLL的LIB。
zhouzhipen 2010-03-03
  • 打赏
  • 举报
回复
我也不是鼓励LZ去这样混用,只是想说混用不会有什么编译或运行出错的问题。但是混用会产生其它的不利结果,比如说文件的版本管理的混乱等。
密斯刘 2010-03-03
  • 打赏
  • 举报
回复
应该有吧 不是很清楚 来向大家学习一下
zhouzhipen 2010-03-03
  • 打赏
  • 举报
回复
引用 15 楼 eajum 的回复:
引用 3 楼 wizardk 的回复:
有区别,你可以试试,隐式调用使用DEBUG的LIB,运行时使用RELEASE的DLL,或者反之,这个叫做“DLL Hell”

了解一下DLL和LIB是什么,你就能想象版本混用的后果了:
1.DLL是一个完整的可执行程序,已链接,即不存在同名引用,且有导出表,与导入表LIB是一个代码集(也叫函数集)
2.伴随DLL的生成而产生的LIB实际上不是真正的函数集,其每一个导出导入函数都是跳转指令,直接跳转到DLL中的位置,这个目的是外面的程序调用DLL时自动跳转

形象的比喻下,你去九寨沟旅游,结果请了一个武当山的导游。。。


很感谢你的解答。

对于其他人跟你的争论,可以打一个比方。

你在钓鱼,旁边有人跟你说话,你说不能说话,会钓不到鱼的。于是他们想:丫神经病啊,说话也是坐着钓,不说话也是坐着钓,怎么可能钓不到。

这则比方告诉我们,不懂就要谦虚。不懂的可以问,但是不要自以为是,误导他人。


伴随DLL的生成而产生的LIB实际上只上一系列的符号表并没有一条实际的指令,更非wizardk所说有跳转指令。
在隐式调用DLL的时候,编译器会跟据LIB中的符号找到相应的DLL入口地址,然后才生成跳转指令。
而在release和debug版所生成的符号表是一样的,如果编译器的设置也不会影响符号表,只是生成的附加信息不同而已。
sunlin7 2010-03-03
  • 打赏
  • 举报
回复
zhouzhipen,不要自以为是。----在VS的默认情况下,release和debug的lib是不一样的,debug带有调试信息,但Release不带,最明显的是文件的大小不一样。
不过确实可以通过设置使debug和release版的lib几乎完全一样(但不包括时间戳等)。
副组长 2010-03-03
  • 打赏
  • 举报
回复
这么说吧,如果真的是跳转表不可能允许混用用的。
其实验证也很简单,找两个文件读到2个BUFFER里,然后一减,就知道是不是一个了。10行就能搞定。
eajum 2010-03-03
  • 打赏
  • 举报
回复
引用 3 楼 wizardk 的回复:
有区别,你可以试试,隐式调用使用DEBUG的LIB,运行时使用RELEASE的DLL,或者反之,这个叫做“DLL Hell”

了解一下DLL和LIB是什么,你就能想象版本混用的后果了:
1.DLL是一个完整的可执行程序,已链接,即不存在同名引用,且有导出表,与导入表LIB是一个代码集(也叫函数集)
2.伴随DLL的生成而产生的LIB实际上不是真正的函数集,其每一个导出导入函数都是跳转指令,直接跳转到DLL中的位置,这个目的是外面的程序调用DLL时自动跳转

形象的比喻下,你去九寨沟旅游,结果请了一个武当山的导游。。。



很感谢你的解答。

对于其他人跟你的争论,可以打一个比方。

你在钓鱼,旁边有人跟你说话,你说不能说话,会钓不到鱼的。于是他们想:丫神经病啊,说话也是坐着钓,不说话也是坐着钓,怎么可能钓不到。

这则比方告诉我们,不懂就要谦虚。不懂的可以问,但是不要自以为是,误导他人。
_JeffreyWu 2010-03-03
  • 打赏
  • 举报
回复
我的LIB库文件一直用的一个,只是在开发时,不停地切换DLL的版本(DEBUG,RELEASE),没发现有什么问题..
现在没发比较,谁可以用比较工具来对比一下,倒底是不是一样,平空说,想当然是不行的
WizardK 2010-03-03
  • 打赏
  • 举报
回复
“开车为什么系安全带,可不一定要出车祸吧”
这个比喻还不恰当吗?
加载更多回复(11)

15,471

社区成员

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

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