• 6452阅读
  • 1回复

一个Bug,请 MinGW 用户帮忙确认一下 [复制链接]

上一主题 下一主题
离线dbzhang800
 

只看楼主 倒序阅读 楼主  发表于: 2010-08-01
背景:这几天在学cmake,然后编译一个极为简单的工程,当用MinGW编译后,报“应用程序正常初始化(0xC0000005)失败”,而用 cmake 生成的nmake files 和 msvc project 工作都正常。用qmake的话,mingw编译的程序也正常。而且对其它例子,无法这个问题重现。

反复确认,试验,最后找到问题根源:盘符大小写导致问题(大写,生成的程序报错;小写,程序正常)

  1. -L"E:\Qt\4.7.0-beta2\lib"

  1. -L"e:\Qt\4.7.0-beta2\lib"


我在自己的 Vista 系统和 xp sp3 系统测试,问题均可重现(采用QtCreator自带的Mingw4.4, Qt版本Qt4.7beta2),以下是测试例程:

程序代码:保存为main.cpp
  1. // main.cpp
  2. #include <QtCore/QCoreApplication>
  3. #include <QtCore/QDebug>
  4. int main(int argc, char ** argv)
  5. {
  6.     QCoreApplication app(argc, argv);
  7.     qDebug()<<"Hello World!";
  8.     return 0;
  9. }


makefile文件:和main.cpp放在同目录下,命名为 Makefile
  1. CXX           = g++
  2. DEFINES       = -DQT_DLL -DQT_CORE_LIB
  3. INCPATH       = -I"e:\Qt\4.7.0-beta2\include"
  4. LIBS          = -L"e:\Qt\4.7.0-beta2\lib"
  5. main:  main.o
  6.     $(CXX)  -o main  main.o  $(LIBS) -lQtCore4
  7. main.o: main.cpp
  8.     $(CXX) -c $(INCPATH) -o main.o main.cpp -Wall -DUNICODE

注意:两个$符号前面都是一个Tab,如果拷贝后变成空格和Tab消失,请手动改正。并将上面出现的两处路径改为你的Qt所在的路径

这时运行make 即可生成可执行程序 main.exe,你可以运行该程序看看是否正常

然后,你可将其中的盘符从小写改成大写,删除main.o,重新运行一次 make 生成新的 main.exe

请帮忙测试一下,两次生成的main.exe 是否都可正常运行,并告知qt的版本和mingw的版本。


我不清楚是Mingw还是Qt导致的这个问题,因为我用Mingw和标准的C++无法重现这个错误。

谢谢
2010.08.01

源码 mingw_qt.zip (1 K) 下载次数:1
[ 此帖被dbzhang800在2010-08-01 17:33重新编辑 ]
离线dbzhang800

只看该作者 1楼 发表于: 2010-08-01
在测试过MinGW3.4.5, 4.4.0, 及 4.5.0-1  与 Qt4.5.3 ,Qt4.6.3 ,Qt4.7.0beta2 之后

最后发现和 Qt4.7.0beta2中自带的 libgcc_s_dw2-1.dll 有关 (这个东西280多k,而Mingw和Qt4.6.3带的只有42k)

用 Mingw 自带的或 Qt4.6.3自带的这个 动态库替换它之后,错误消失(世界太平了)。

如果说这个库有问题,可是这仍然不能解释这个现象,为什么另一个使用该动态库却可以工作。而且用进程查看工具可以看到另一个程序运行时可以正常加载Qt4.7.0提供的这个库。
快速回复
限100 字节
 
上一个 下一个