惨痛的教训,编译程序时一定要注意c运行时库的选择
来源:互联网 发布:单片机计时器原理 编辑:程序博客网 时间:2024/06/08 15:00
关于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,才解决这个问题。
- 惨痛的教训,编译程序时一定要注意c运行时库的选择
- 惨痛的教训,编译程序时一定要注意c运行时库的选择
- 一个C语言的惨痛教训
- jQuery的惨痛教训
- 惨痛的教训
- 使用ConcurrentLinkedQueue惨痛的教训
- 惨痛的教训改用SVN
- 代码编写的惨痛教训
- flask 404 惨痛的教训
- 使用ConcurrentLinkedQueue惨痛的教训
- 惨痛的wordpress调试教训
- 自大的cocos2dx程序员惨痛的教训
- 记录一次惨痛的升级glibc 教训
- Linux下的惨痛教训=>LTS
- [原]使用ConcurrentLinkedQueue惨痛的教训
- >/dev/null 2>&1 & 的惨痛教训
- 关于django model_set 的惨痛教训
- 惨痛的教训,NSURL访问本地文件的问题
- 如何使用Core Text创建一个简单的杂志图书App
- 使用Smali代码注入
- Laying out text with Core Text
- js 得到select所有option里的值
- cocos2d-x 开发常用代码(3.0)
- 惨痛的教训,编译程序时一定要注意c运行时库的选择
- 扯淡之erlang生涯 -- 持续更新
- ACM——第几天
- android 开发中用到的代码总结(三)
- LeetCode——Unique Paths
- to_char函数对日期进行转换的格式
- ACM培训②
- Convert WebP to PNG using java
- DIV CSS left right top bottom定位