VS2013编译的用c++写的win32程序兼容性问题
2014-03-26 17:18
951 查看
最近在用VS2013写程序,把编译好的exe在别人的电脑上运行就会出现缺少msvcp文件不能运行的情况。在网上搜了一下,问题原因如下:
C/C++程序运行时需要标准库的支持,Windows下为msvcrt.dll(C运行时)和msvcp(C++运行时),Linux下为libc.so和libstdc++.so。Windows
XP里面自带VC 6.0的运行时,如果用VC 6编译的话可以正常运行。
VS 2013的运行时必须额外安装,也就是vc2013 redistribution。也可以像你现在做的这样,编译时选择/MT,这时运行时将直接包含在你的执行文件中,就可以在任意机器上运行。这也是为什么你的文件变得非常大,因为标准库的实现被包括进去了。
2、编译时选择/MT,这时运行时将直接包含在你的执行文件中,就可以在任意机器上运行。
以VS2005为例,这样子打开:
1) 打开项目的Property Pages对话框
2) 点击左侧C/C++节
3) 点击Code Generation节
4) 右侧第六行Runtime Library项目
简单的说:
(1)/MD,表示运行时库由操作系统提供一个DLL,程序里不集成。
(2)/MT,表示运行时库由程序集成。
(1)程序就不需要静态链接运行时库,可以减小软件的大小;
(2)所有的模块都采用/MD,使用的是同一个堆,不存在A堆申请,B堆释放的问题。
(1)有些系统可能没有程序所需要版本的运行时库,程序必须把运行时库静态链接上。
不同的模块各自有一份C运行时库代码、或者根本没有C运行时库,导致了各个模块会有各自的堆。如果在A堆中申请空间,到B堆中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放。
附件(下载地址:http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar)的DLL以及DLLUser代码,以STL的string为例,通过修改编译选项验证了这个问题。(string在赋值的时候需要释放掉原来的空间,然后再申请新的空间存储新的内容。)
1、微软关于MT、MD等的详细介绍
http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
2、不要出现A模块申请,B模块释放的情况
/article/6541678.html
3、运行时库有哪些版本
http://www.cppblog.com/MichaelLiu/articles/10607.html
4、CSDN上关于堆空间释放的讨论
http://topic.csdn.net/t/20010112/09/57983.html
http://topic.csdn.net/t/20031009/17/2338051.html
http://topic.csdn.net/u/20090502/00/bf1602e3-ddf5-49b0-af81-8a23383f9ddc.html
/article/11039945.html
5、不同模块不同的堆
/article/7068898.html
C/C++程序运行时需要标准库的支持,Windows下为msvcrt.dll(C运行时)和msvcp(C++运行时),Linux下为libc.so和libstdc++.so。Windows
XP里面自带VC 6.0的运行时,如果用VC 6编译的话可以正常运行。
VS 2013的运行时必须额外安装,也就是vc2013 redistribution。也可以像你现在做的这样,编译时选择/MT,这时运行时将直接包含在你的执行文件中,就可以在任意机器上运行。这也是为什么你的文件变得非常大,因为标准库的实现被包括进去了。
解决办法:
1、在生成解决方案时选择release,而不是debug。2、编译时选择/MT,这时运行时将直接包含在你的执行文件中,就可以在任意机器上运行。
具体操作:
一、MD(d)、MT(d)编译选项的区别
1、编译选项的位置
以VS2005为例,这样子打开:1) 打开项目的Property Pages对话框
2) 点击左侧C/C++节
3) 点击Code Generation节
4) 右侧第六行Runtime Library项目
2、各个设置选项代表的含义
编译选项 | 包含 | 静态链接的lib | 说明 |
/MD | _MT、_DLL | MSVCRT.lib | 多线程、Release、DLL版本的运行时库 |
/MDd | _DEBUG、_MT、_DLL | MSVCRTD.lib | 多线程、Debug、DLL版本的运行时库 |
/MT | _MT | LIBCMT.lib | 多线程、Release版本的运行时库 |
/MTd | _DEBUG、_MT | LIBCMTD.lib | 多线程、Debug版本的运行时库 |
(1)/MD,表示运行时库由操作系统提供一个DLL,程序里不集成。
(2)/MT,表示运行时库由程序集成。
二、/MD、/MT的选择
1、为什么选择/MD,不选/MT?
(1)程序就不需要静态链接运行时库,可以减小软件的大小;(2)所有的模块都采用/MD,使用的是同一个堆,不存在A堆申请,B堆释放的问题。
2、为什么选择/MT,不选择/MD?
(1)有些系统可能没有程序所需要版本的运行时库,程序必须把运行时库静态链接上。
3、多个模块,必须选择相同的运行时库。
三、选择/MT需要解决的堆空间释放问题
不同的模块各自有一份C运行时库代码、或者根本没有C运行时库,导致了各个模块会有各自的堆。如果在A堆中申请空间,到B堆中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放。附件(下载地址:http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar)的DLL以及DLLUser代码,以STL的string为例,通过修改编译选项验证了这个问题。(string在赋值的时候需要释放掉原来的空间,然后再申请新的空间存储新的内容。)
四、参考资料
1、微软关于MT、MD等的详细介绍http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx
2、不要出现A模块申请,B模块释放的情况
/article/6541678.html
3、运行时库有哪些版本
http://www.cppblog.com/MichaelLiu/articles/10607.html
4、CSDN上关于堆空间释放的讨论
http://topic.csdn.net/t/20010112/09/57983.html
http://topic.csdn.net/t/20031009/17/2338051.html
http://topic.csdn.net/u/20090502/00/bf1602e3-ddf5-49b0-af81-8a23383f9ddc.html
/article/11039945.html
5、不同模块不同的堆
/article/7068898.html
相关文章推荐
- VS2013的C++程序用VS2017运行,出编译错误
- vs2013编译的程序不能在XP和2003下执行问题的解决
- Qt5.5+VS2013编译的程序在xp下兼容问题解决方法
- 运行VS2013编译成功后出现:无法启动程序“.exe” 系统找不到指定文件的问题的解决方法
- 在64位机子调用vs编写的win32 c++程序遇到问题
- vs2013 编译问题c++
- QT用VS2013编译的程序在XP下是无效的win32应用程序
- VS2013 编译 Win32程序,如何配置版本等信息
- 在WIN10系统下运行VS2013编译成功后出现:无法启动程序“.exe” 系统找不到指定文件的问题的解决方法
- vs2013编译程序不能在xp上运行的问题
- VS2013打包程序后在其他电脑显示(null)不是有效的win32应用程序的问题
- 用VisualGDB在vs2013在linux服务器上编译代码的3073问题
- VS2013生成Dll,在另一工程中调用dll(C++Win32)
- VS2013(Ctrl+F5)运行程序后闪退问题
- VS2013 编译程序时提示 无法查找或打开 PDB 文件
- matlabR2014a 和VS2013 交叉编译问题
- C++程序编译运行后窗口一闪而过问题
- C++程序编译运行后窗口一闪而过问题
- VS编译程序无法定位程序输入点的问题
- VS2013 编译程序时提示 无法查找或打开 PDB 文件