VC++2005相关问题解决方案
2007-11-23 21:00
204 查看
微软的VC++ 2005的强大功能让人体验了不一样的感觉,对于习惯了VC++6.0的程序员来说可能会感觉VC++2005总有一些莫名其妙的问题。 诚然,VC++2005是存在着那么一些问题。这让使用VC++2005的新手感觉很不适应,以至于不断有人抱怨。在论坛上也总有人问在VC++2005中编译好的程序在没有装VC的机子上不能运行的问题。大家的回复也是众说纷纭。反而让人更加迷茫。由此就有了这篇文章。
为了避免少走弯路,今天把VC++2005的一些相关问题汇集下来,并给出具体解决方案。
1.最著名的问题-------本机编译好的程序无法在没有装VC的机子上运行
由于VC++2005默认采用动态链接运行时库,导致编译好的程序在运行时依赖于本机的运行时库,当然移植到别的机子上就不能运行了。真不知道微软当初怎么想的,难道把所有人都当程序员么,自己写的程序都是给自己用的?呵呵。不过微软犯迷糊我们不能跟着迷糊,这个问题解决起来也不难。就是采用静态编译就可以了。具体如下:
对于一般的win32控制台程序,可以这样设置:
点击"项目"--- "属性",打开项目属性页,点击 "配置属性"--- "C/C++"--- "代码生成",将此页面右边的 "运行时库"由默认的 "多线程DLL(/MD)"改为 "多线程(/MT)"或 "多线程调试(/MTD)"即可。
不过一般情况下生成release版本的应用程序时选 "多线程(/MT) "即可,因为这样生成的exe程序较小。
而如果选了 "多线程调试(/MTD) ",则由于加入了大量的调试信息而使生成的exe程序会增大好几倍。
对于MFC程序,则点击"项目"--- "属性",打开项目属性页,点击 "配置属性"--- "常规",将右边"项目默认值"栏目中的"MFC的使用"改为"在静态库中使用 MFC"。确定后,在"配置属性"--- "C/C++"--- "代码生成"页面的"运行时库"会自动改为静态链接----即"多线程(/MT)"。这样编译出来的程序就可以在没有装VC的机子上运行了。
2.也是很经典的问题---在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语句就不能输出中文了,虽然这时候操作中文文件没有问题,但是这也是很容易让人掉入陷阱的地方,应该值得注意。
今天就进行这么多了,以后遇到更多的再继续总结了。
为了避免少走弯路,今天把VC++2005的一些相关问题汇集下来,并给出具体解决方案。
1.最著名的问题-------本机编译好的程序无法在没有装VC的机子上运行
由于VC++2005默认采用动态链接运行时库,导致编译好的程序在运行时依赖于本机的运行时库,当然移植到别的机子上就不能运行了。真不知道微软当初怎么想的,难道把所有人都当程序员么,自己写的程序都是给自己用的?呵呵。不过微软犯迷糊我们不能跟着迷糊,这个问题解决起来也不难。就是采用静态编译就可以了。具体如下:
对于一般的win32控制台程序,可以这样设置:
点击"项目"--- "属性",打开项目属性页,点击 "配置属性"--- "C/C++"--- "代码生成",将此页面右边的 "运行时库"由默认的 "多线程DLL(/MD)"改为 "多线程(/MT)"或 "多线程调试(/MTD)"即可。
不过一般情况下生成release版本的应用程序时选 "多线程(/MT) "即可,因为这样生成的exe程序较小。
而如果选了 "多线程调试(/MTD) ",则由于加入了大量的调试信息而使生成的exe程序会增大好几倍。
对于MFC程序,则点击"项目"--- "属性",打开项目属性页,点击 "配置属性"--- "常规",将右边"项目默认值"栏目中的"MFC的使用"改为"在静态库中使用 MFC"。确定后,在"配置属性"--- "C/C++"--- "代码生成"页面的"运行时库"会自动改为静态链接----即"多线程(/MT)"。这样编译出来的程序就可以在没有装VC的机子上运行了。
2.也是很经典的问题---在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语句就不能输出中文了,虽然这时候操作中文文件没有问题,但是这也是很容易让人掉入陷阱的地方,应该值得注意。
今天就进行这么多了,以后遇到更多的再继续总结了。
相关文章推荐
- VC++2005相关问题解决方案
- vc2008 项目拆分库 出现 LNK2005 库函数重复定义的问题的解决方法
- 解决VC6 --> VC2005 --> VC2008 中没有<sys/time.h> 问题
- vc6.0配置Wincap环境以相关问题解决方案
- Sql Server 2005 与Sql Server Mobile(Sql server 2005 mobile Edition)数据同步步骤以及问题解决方案
- Visual Studio 2005 Web 项目在Vista中断调试问题解决方案
- Source insight安装使用相关问题解决方案
- Visual Studio 2005(c#)项目调试问题解决方案集锦
- 激活Windows Thin PC以及使用时的相关问题解决方案
- linux相关问题解决方案
- linux下oracle的安装与卸载及相关问题解决方案
- Microsoft SQL Server 2005 中相关问题的解决办法
- VC2005的程序文件分发问题及解决
- 关于C++(VC2005)编译多一条JMP指令的问题,待解决
- VC++ 升级到visual studio 2008 后,调试DirectShow中的Sample编译出错问题解决方案
- VC2005 CCheckListBox显示乱码问题的解决
- MySQL数据目录更改及相关问题解决方案
- eclipse相关问题解决方案
- linux+11g R2 ORACLE 安装过程及遇到相关问题解决方案
- WebService:Java client + .NET WSE 2.0 相关问题解决方案