惨痛的教训,编译程序时一定要注意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,才解决这个问题。

你可能感兴趣的:(惨痛的教训,编译程序时一定要注意c运行时库的选择)