C++编译器的问题

kaienfr 2009-04-04 11:27:02
我这个问题有点特殊,请大家仔细看我的描述,然后再作答,谢谢!

前言:
最近涉及到不少跨平台编程和移植的情况。
主要是把Unix或Linux的程序,移植到Windows下编译使用。
我这里提出的问题,就是在一个Unix程序的移植过程中产生的。

问题描述:
我有一个程序,移植到Windows下,经过一些修正和处理后,用VS2008建了工程文件,并编译之。
结果是release和debug模式都很正常,且生成A.exe文件。但是程序运行到一半的时候就出错了,察看错误报告里显示:
AppName: A.exe AppVer: 0.0.0.0 ModName: msvcr90.dll
ModVer: 9.0.21022.8 Offset: 0006d0f0
似乎问题出在msvcr90.dll的调用上。(可以肯定的是,绝对不是缺少这个文件造成的。)

请大家不要忙着发表建议,再看看我接下来的描述。
我把同样的代码,在Code::Blocks上编译,这次用的是C::B默认的Mingw版g++编译器。
这次的编译当然也很顺利。且生成的程序(release和debug版)运行都非常正常,且没有任何错误。

所以我的问题就是,为什么VC上编译出来的程序,运行的时候出错,而C::B上的就很正常?

附加信息:
我曾察看VC的项目属性,发现C/C++选项卡的运行时库默认是使用多线程DLL /MD。
我尝试把他设为非DLL的多线程库 /MT (主要目的是避免调用那个dll)。
结果这次编译出来的程序还是运行到一半出错。这次显示的错误是出在A.exe上了:
AppName: A.exe AppVer: 0.0.0.0 ModName: A.exe
ModVer: 0.0.0.0 Offset: 00075b66

问题总结:
综上所述,大家认为,问题的根本原因到底出在哪里?代码本身似乎没有问题,否则C::B下编译出来的程序就不会正常运行。
问题应该是出在VC上,我猜想可能是VC的项目设置里,也可能是VC的编译器上,说不准。
所以,请有经验的高手帮忙指教,期望找到合理的答案。谢谢!
...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaienfr 2009-04-06
  • 打赏
  • 举报
回复
看来大家的猜测跟我想的都差不多啊
不过调试起来可能会比较麻烦,执行的方式也比较特殊。而且上百个代码文件也比较多。

详细的来说,我需要编译成两个执行文件callA.exe 和A.exe
还需要一个数据文件data.dat

运行的时候是这样的
callA.exe < data.dat | A.exe
实际过程是,通过callA.exe读取data.dat的数据,然后把输出A.exe作参数处理。

我把输出重定向保存到文件中 callA.exe < data.dat > 'in.txt'

然后使用in.txt作为A.exe的参数进行调试。
发现错误似乎出在程序开头,对几个类的初始化化操作。而那几个类都是程序自己的类。而且类里面嵌套类。
说实在,我对代码内部这些东西不感兴趣,只想拿这个程序在windows上用用而已。
所以决定放弃调试了。还是直接使用gcc编译出来的程序好了。

所以,跨平台移植程序的时候,还是选用合适的编译器比较好。可以大大减少代码的修改量和运行出错的几率。
hityct1 2009-04-05
  • 打赏
  • 举报
回复
mark
wqvbjhc 2009-04-05
  • 打赏
  • 举报
回复
在VC中调试,看出错在哪里
morris88 2009-04-05
  • 打赏
  • 举报
回复
貌似你有部分代码对VC支持的不好啊!
xiaopoy 2009-04-05
  • 打赏
  • 举报
回复
G 00075b66 完美解决问题。

vc实现c库函数的方式和gcc不一样,你把那些使用了gcc特性的编码修改即可。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧