首页| 论坛| 消息

回复: 有谁用MinGW 4.9.2编译过Debug版本的Qt 5.4.1吗?
#6 回 彩阳 的帖子 [johnyork 03-06 20:41]
彩阳:
不要c++11看看?-iconv 也不要看看?
花了2天时间跟踪错误,发现是LibQt5Core.a中未输出zlib模块的API造成的。进一步分析发现/qtbase/src/3rdparty/zlib/zconf.h中的宏ZEXPORT按预处理环境最后被定义为extern,而不是dll输出用的extern __declspec(dllexport)。
为了让ZEXPORT成为extern __declspec(dllexport),需要预定义一个宏ZLIB_DLL,而为了让编译过程能单独对-shared选项生成ZLIB_DLL宏,我更改了/qtbase/src/3rdparty、zlib_dependency.pri:
原代码:# zlib dependency satisfied by bundled 3rd party zlib or system zlib
contains(QT_CONFIG, system-zlib) {
if(unix|mingw):LIBS_PRIVATE += -lz
else {
isEmpty(ZLIB_LIBS): LIBS += zdll.lib
else: LIBS += $$ZLIB_LIBS
}
} else {
INCLUDEPATH +=$$PWD/
}更改后代码:# zlib dependency satisfied by bundled 3rd party zlib or system zlib
contains(QT_CONFIG, system-zlib) {
if(unix|mingw):LIBS_PRIVATE += -lz
else {
isEmpty(ZLIB_LIBS): LIBS += zdll.lib
else: LIBS += $$ZLIB_LIBS
}
} else {
INCLUDEPATH +=$$PWD/
contains(QT_CONFIG, shared) {
DEFINES += ZLIB_DLL
}
}但是DEFINES += ZLIB_DLL似乎不起作用,在zconf.h中仍然检测不到ZLIB_DLL宏的存在。该怎么做呢?
#7 [johnyork 03-07 20:00]
又折腾了一天,貌似目前无解。
configure使用-shared、-qt-zlib参数,编译出的LibQt5Core.a没有zlib的API函数,因此在编译QtNetwork.dll时无法找到使用使用的zlib API函数,编译无法通过。
configure使用-shared,不带-qt-zlib参数时QtNetwork.dll可以编译成功,但是在编译opengl时又出错了,貌似问题多多啊!
#8 [johnyork 03-11 22:48]
基本搞清楚原因了:
当带-shared参数做configure时,生成的/qtbase/src/corelib/qglobal.h会多一个宏定义“Q_VISIBILITY_AVAILABLE”,而在zlib的诸多.c文件中,该宏的存在导致ZEXPORT宏被定义为__attribute__(visibility("default")),经过MinGW编译链接后生成的Qt5Core.dll的lib文件不包含zlib API的重定向信息,因此在编译链接后续需要引用zlib模块API的dll时便出错了(我是在编译QtNetwork.dll时出错)。
暂时的解决办法:
在configure时把-no-reduce-export和-shared配合使用
进一步的思考:
经过实验,发现官网下载的Qt安装包中的MinGW4.9.1 32bit也会产生同样的错误,这说明编译器版本不兼容的可能性很小,于是造成错误的可能只有3个:1.__attribute__(visibility("default"))这个指令不适用于Windows平台;2.MinGW在实现__attribute__(visibility("default"))指令时存在Bug;3.Qt源码的配置脚本configure未充分考虑__attribute__(visibility("default"))和Windows平台的兼容性。最终哪一个才是真正的原因,还有待Qt开发组和各位高人来定位和解决。
注:因为手机打字,没在电脑旁,看不了源代码,文中的__attribute__(visibility("default"))和Q_VISIBILITY_AVAILABLE可能有误,一切以官方源码为准。

<< 1 2 >> (2/2)

回复 发表
主题 版块