惨痛的教训,编译程序时一定要注意c运行时库的选择
2011-10-07 19:37
357 查看
关于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运行时库有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运行时库的选择
- 选择login_activity作为程序运行的入口需要注意的情况
- VS2013编译WinXP下运行程序注意事项
- linux环境下编译源码和运行程序时,include文件和lib库文件的注意事项
- DOC编译和运行java程序注意事项
- 编译OpenSSL 动态库/静态库以及运行时库的选择
- 1.4.Qt通过命令行编译运行程序注意事项
- win7上编译的用ADO访问Access数据库的程序运行在WindowsServer2003上的注意事项
- 编译OpenSSL 动态库/静态库以及运行时库的选择
- 编译OpenSSL 动态库/静态库以及运行时库的选择
- qt creator编译的程序 打包发布 (程序运行错误注意)
- 编译OpenSSL 动态库/静态库以及运行时库的选择
- 编译OpenSSL 动态库/静态库以及运行时库的选择
- vs2010编译程序无法在XP SP2以前运行的解决方案
- linaro-交叉编译程序无法运行
- 不离开Emacs完成简单程序的编辑编译运行(windows或Linux)
- 使用J2WTK2.2编译和运行第一个J2ME的HelloWorld程序
- 面对系统中多个版本的VC运行时库,应用程序如何选择
- 在VC中编译、运行程序的小知识点 (出处CSDN)
- 开发程序一定要注意精度的问题