惨痛的教训,编译程序时一定要注意c运行时库的选择

     关于c运行时库的基本知识可以自行google。

     基本上我们进行选择的c运行时库有4个,对应于vc中c/c++---Code Generation--Runtime Library中的4个标志。

MultiThread(static link)   libcmt.lib
Debug multiThread(static link) libcmtd.lib
MultiThread(dynamic link) msvcrt.lib
Debug multiThread(dynamic link) msvcrtd.lib

即静态c运行时库(lib),和动态c运行时库(dll,msvcrt.lib是导出库),和其对应的debug版本。

 

使用静态c运行时库的好处是不需要依赖特定的dll,即便用户没有装运行时库也可以运行程序。坏处是程序文件稍大。

使用动态c运行时库的好处是程序文件较小,并且假如微软升级了c运行时库(比如修正某些bug),我们不需要重新编译程序。

 

    具体使用动态或是静态其实没有太大关系,但是有一点需要明确,那就是一旦我们选择好使用c运行时库的方式,那么所有与程序相关的依赖库都要使用相同的c运行时库。我们编译boost或者qt等库的时候,就有专门的选项配置这个。如果选择的运行时库不一致的话,vc会给出警告,告诉我们库有冲突。如果置之不理,那程序运行的时候可能就会出现非常诡异的崩溃。如果因为某些原因实在无法保持一致,那么也一定要在Linker--Input---Ignore Specific Default Libraries中添加好要忽略的c运行时库。否则两个版本的运行时库共同使用,发生内存错误简直是必然的。(比如,使用release版本的运行时库分配内存,却使用debug版本的运行时库释放这块儿内存)

    我一开始没有注意这个问题,程序的一个依赖库选择的是msvcrt.lib(release版本),程序本身选择的是msvcrtd.lib(debug)版本,结果就导致程序退出的时候总发生莫名奇妙的崩溃。一调试发现是c运行时库退出程序的时候清理堆内存发生错误,但是无论怎么修改程序代码都无法解决问题。直到无意间发现这个warning,添加了忽略依赖库msvcrt.lib,才解决这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值