如何使自己维护的lib/dll不再需要区分debug与release?

jzp_1981 2017-09-14 04:28:07
加精
我们在用vc++写软件的时候一般都会为不同的dll proj配置生成不同的_ud/_u的lib和dll,在其他工程中引用的时候通过编译选项在链接不同的lib,大家都是这样做的。
我的问题是如果debug与release需要区分,32与64也需要区分,那我们需要维护四个lib,感觉debug与release的能否合并呢?难道只能是纯c的吗?

我看到一些商业的lib/dll只有release的,在自己工程中debug/release的时候用也没有问题,但是自己写的lib反而不行。不知道是哪里的问题导致的。

如果我假定现在有个lib的代码很稳定,也不存在兼容性问题,debug/release能否合并成一个,有什么约束条件?合并完之后还要保证编译、运行没有问题。
...全文
11474 77 打赏 收藏 转发到动态 举报
写回复
用AI写文章
77 条回复
切换为时间正序
请发表友善的回复…
发表回复
wujun_2015 2021-01-22
  • 打赏
  • 举报
回复
是的,不需要区分,如果是因为要debug输出信息,可以设置一个flag,到时打开就可以了. 一般程式都是release发行给别人使用的,debug都不会正式给别人用,也不好用,需要搭配很多dll,很麻烦。
fly4free 2020-11-20
  • 打赏
  • 举报
回复
这都哪年的帖子了,论坛能不能按照发帖时间排序,我记得之前有这功能啊。 既然提到了,那就说说,一个极端就是, ● 导出的东西都使用 基本数据类型 only 的,那肯定 Release 调用 Debug, Debug 调用 Release 都没差了。 造成必须区分的原因就是二进制边界不一致。 MFC 的dll一般会 有 xxx.dll xxxd.dll,在windows 上使用 stl 库也要有这个考虑,我试过在某个版本的linux下,debug/release 没出现 windows 下存在的区别,其实是开发库,SDK库本身的形式造成的,其本身为了某种目的,两个版本有一些区别的代码,比如debug版本增加一些有助于debug的代码。 ● 如果一切都有一个接口定义在先,传进传出都通过接口的方法来完成,函数调用时传递接口指针(或者二级指针三级指针……),无论哪方都只调用接口定义的方法,那就没问题了,但如果这个形式放在 mfc,STL 等上,估计就不行了,无端的增加麻烦。
wst_test 2020-11-12
  • 打赏
  • 举报
回复
我觉得跟release/debug本身是没什么关系 具体还是要看你用的库里面做了什么区别 例如 如果库里写了 #ifndef _DEBUG // 额外的初始化、跟具体环境相关的初始化、使用“真实”的参数等等 // 都可以导致区别 #endif 至于自己的库为什么引起这些问题,那还是因为依赖了别人的库,可以尽量少依赖库,例如MFC 而直接调用API 因为API没有要求你用debug版 而mfc如果没吃透 就不能尽知有哪些特定debug/release的套路只能靠猜
女神打Boss 2020-11-11
  • 打赏
  • 举报
回复
答案是不可以
  • 打赏
  • 举报
回复
我也有此疑惑,搞不太懂
aianzujia 2018-06-07
  • 打赏
  • 举报
回复
受用了,谢谢大神们
red-fly 2017-10-30
  • 打赏
  • 举报
回复
通常发布用的是release版本,而debug版本用于自己的调试。 如果不需要,可以把debug版本的编译选项设置成和release完全一样,那编译出来的就应该和release版本一样了,但那样debug版本用于调试的目的就没有了,如果是这样,那学不如直接把debug这个类型从编译管理里面删除掉,就只剩下release版本了 通常,库的调用者使用release版本的库也可以调试,这个肯定也是和其它商业发布的版本是一样的,如果某些电脑上不行,那一般是依赖的文件有问题导致的
qq_35533527 2017-10-30
  • 打赏
  • 举报
回复
引用 47 楼 wh_2396 的回复:
没办法,人生就是这么无奈,很多时候就是跟这些无聊的东西在打交道。 你说操作系统都用win10多好了,非得有人用xp. vista win7 win8 win8.1。 然后你写出的程序要在这些个操作系统上一个一个地试一遍。还要区分32 64位
确实,我还见过win2000的服务器,为了兼容,不得不另外单独开发个模块
bloodfeather85 2017-10-26
  • 打赏
  • 举报
回复
不懂 但是帮顶啊 2333
日月路明 2017-10-18
  • 打赏
  • 举报
回复
一直用Delphi,如果用loadlibrary 动态加载,完全看不懂Release和debug版本有什么区别
「已注销」 2017-10-17
  • 打赏
  • 举报
回复
围观下,看起来不错
ldwpadp 2017-10-12
  • 打赏
  • 举报
回复
学习,谢谢分享。
yaof12 2017-10-11
  • 打赏
  • 举报
回复
不懂 但是帮顶啊 2333
qq_40565989 2017-10-10
  • 打赏
  • 举报
回复
不懂 但是帮顶顶..........
fly4free 2017-10-10
  • 打赏
  • 举报
回复
需要编译成 _u/_ud 的是因为 dll 导出的函数参数或者返回值 可能用到了 std::string、CString 等类型,这些个类型的 debug/release 版本是不同的。用到 CString 的可能是因为dll 端用的 A/W ,而调用端用了 W/A 版的 CString ( CStringW / CStringA 的 UNICODE 与 非UNICODE的区别 ) 这些包括但不限于这些情况,都会造成 dll 与调用者之间 产生 二进制兼容性问题。。 你能保证不产生这些问题,就可以了
nettman 2017-10-06
  • 打赏
  • 举报
回复
学习了
猿缘猿 2017-09-30
  • 打赏
  • 举报
回复
引用 4 楼 jzp_1981 的回复:
[quote=引用 2 楼 smwhotjay 的回复:] release 即可。
自己做个例子,一个dll(随便导出一个函数或类),一个exe,在exe的debug状态引用dll的release库,看看报什么错误 。[/quote] 回复后有消息推送吗?
猿缘猿 2017-09-30
  • 打赏
  • 举报
回复
[quote=引用 62 楼 qq_37569495 的回复:] [quote=引用 4 楼 jzp_1981 的回复:] [quote=引用 2 楼 smw 每次引用都把原来的内容回显,如果别人把上面的内容删除了,咋办?
jzp_1981 2017-09-28
  • 打赏
  • 举报
回复
引用 57 楼 schlafenhamster 的回复:
error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug” 使用到 debug 库。 你的 dll 必须不 使用 debug 库
主要是不想同时维护debug与release两个库,而且别人也说可以只用release。
jzp_1981 2017-09-28
  • 打赏
  • 举报
回复
引用 54 楼 zhao4zhong1 的回复:
C Run-Time Libraries http://msdn.microsoft.com/zh-cn/library/abx4dbyh(VS.80).aspx
没明白您要表达的意思。
加载更多回复(57)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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