大众世界 world of demotic + 社区新动力

 找回密码
 注册会员
搜索
查看: 5416|回复: 0

[C++/C] 最著名的问题-------本机编译好的程序无法在没有装VC的机子上运行

[复制链接]
发表于 2013-5-15 14:14:13 | 显示全部楼层 |阅读模式
由于VC++2005默认采用动态链接运行时库,导致编译好的程序在运行时依赖于本机的运行时库,当然移植到别的机子上就不能运行了。真不知道微软当初怎么想的,难道把所有人都当程序员么,自己写的程序都是给自己用的?呵呵。不过微软犯迷糊我们不能跟着迷糊,这个问题解决起来也不难。就是采用静态编译就可以了。

具体如下:

对于一般的win32控制台程序,可以这样设置:

点击"项目"--- "属性",打开项目属性页,点击 "配置属性"--- "C/C++"--- "代码生成",将此页面右边的 "运行时库"由默认的 "多线程DLL(/MD)"改为 "多线程(/MT)"或 "多线程调试(/MTD)"即可。      
不过一般情况下生成release版本的应用程序时选 "多线程(/MT) "即可,因为这样生成的exe程序较小。      
而如果选了 "多线程调试(/MTD) ",则由于加入了大量的调试信息而使生成的exe程序会增大好几倍。



不过若是MFC程序,这种方法在VC++2005 express中却行不通。

改为静态链接后,反而提示至今我也没有找到解决的办法。不过我现在对于MFC也是刚刚接触,无奈~~~


2.

cl: 命令行 error D8016 :“/MTd”和“/clr:pure”命令行选项不兼容


也是很经典的问题---在VC++ 2005中fstream对象无法访问中文路径下的文件,

包括英文路径下的中文名文件。

这是VS的一个BUG,原因是本地化的问题,如下处理即可:

在用ifstream和ofstream打开文件前设置全局locale为本地环境,打开文件后再设置回去。                          

   ofstream writefile;
    string filename=("d:\我的文档\测试.txt");
    locale loc = locale::global(locale("")); //要打开的文件路径包含中文,设置全局locale为本地环境
    writefile.open(filename.c_str(),ios::out); //打开文件
    locale::global(loc);//恢复全局locale

用locale对象的name方法可以看到,通过locale("")构造出的locale对象的name为"Chinese_People's Republic of China.936",而原始的locale对象的name为"C",也就是缺省的ANSI_C公约。

注意:如果使用locale loc = locale::global(locale(""))设置全局locale后没有用 locale::global(loc)恢复的话,那么在程序后面的cout语句就不能输出中午了,虽然这时候操作中文文件没有问题,但是这也是很容易让人掉入陷阱的地方,应该值得注意。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Archiver|手机版|小黑屋|Wod Inc. ( 蜀ICP备20000008号-8

GMT+8, 2024-5-11 05:07 , Processed in 0.098397 second(s), 30 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表