事情大概是这样的:公司软件采用的5.8.0版本开发windows桌面程序,为了方便定位Qt的崩溃问题,获取实现细节,故而需要源码编译。
需要声明的是官网提供的方案是通过jom工具调命令行方式编译,本人没试过,主要想着通过qmake将pro转成vcproj方式编译,毕竟用vs比较习惯了。
前期准备:
(1)官网下载带源码的安装包,大家可以自行搜索qt-opensource-windows-x86-msvc2015_64-5.8.0.exe,包的大小1.03G
(2)双击安装源码到指定目录,假设根目录为${Root},细节略
(3)借助vs安装的Qt-VS-Tools插件打开${Root}/src/qtbase/src/src.pro,注意不要打开Root/src/qtbase/src/qtbase.pro(会引发错误)。不出意外,打开src.pro会报错如下:
qtconfig.pri等三个文件找不到,以及Project ERROR:Could not find feature libatomic.
问题解决:
(1)针对qtconfig.pri等三个文件找不到的问题,我将之前编过的qt5.9.8中对应的几个文件直接拷贝过来,故而最终问题只剩下could not find feature libatomic。
(2)通过everthing按名称搜引用libatomic的地方,找到了若干文件,也没看出些眉目。
于是剑走偏锋,既然是qmake爆出的错,那就直接编译qmake源码跟进去调试下为嘛提示找不到libatomic,于是又掉进了另一个坑。
(1)同样通过Qt-VS-Tools工具打开qmake下的qmake.pro,转成vcxproj文件。工程文件倒是生成成功了,但是编译的时候居然还是提示libatomic相关的内容找不到,于是暂时放弃
(2)通过qtcreator打开qmake.pro方式编译,工程打开倒是挺顺利,但是编译的时候会遇到如下几个错误,每个都会让你想要放弃:
- qstring_compat.cpp的错误,这里采用的方式是cpp内容全部清空
- QT_VERSION_STR等相关的定义找不到,添加qconfig.h即可
- 链接时提示QDebug、QRingBuffer相关的未解析错误,这个需要修改pri文件,补充遗漏的cpp即可
- 提示shgetknownfolderpath等win32相关api无法解析,修改qmake.pri,补充shell32.lib即可
至此qmake.exe成功生成,接下来就开始调试为嘛提示libatomic的问题
-----------------------------------------------------分割线---------------------------------------------------------------
- 关于qtconfig.pri等几个文件找不到的原因,终于找到了,需要提前将perl.exe路径加入Path中,接着利用vs的命令行工具调configure.bat,这几个文件会自动生成,包括libatomic找到的问题也解决了,不过暴露出了一个新问题:Library "pcre" is not defined.
- 采用vs命令行工具成功编译通过,大概步骤如下:
./configure.bat -force-debug-info
nmake
其中force-debug-info主要是为了编译带调试信息的release版本
最终结果如下: