最近在搭建Qt工程的编译服务器,需要通过shell脚本执行工程的编译过程,写在这里,总结最近的工作。
1. 构建过程
以Windows为例,在QtCreator中左侧选择“项目”便可以看到编译的指令和参数,这些操作也会在我们点击“构建项目”时执行,执行的过程可以在“编译输出”的窗口中看到,包含命令和编译的日志。
构建的步骤包含qmake和Make,有时也会用到Clean。我使用的命令也都基本来自于这里。
2. 过程分析(以MacOS为例,Windows同理)
Make和Clean是依据Makefile文件进行的,而Makefile文件是qmake时生成的,所以第一步是qmake,那么在哪里执行qmake呢?
第一次我的做法是这样子的:
cd 源码目录
qmake xxx.pro #Makefile生成在源码目录
cd ..
mkdir build-xxx-Desktop_Qt_5_14_2... #创建影子编译的目录
cd build-xxx-Desktop_Qt_5_14_2... #进入影子编译目录
cp Makefile #从源码目录拷贝Makefile到影子编译目录
/usr/bin/make -j8 #编译
这样的结果是,编译时候找不到xxx.pro文件,make失败。后经排查,发现在Makefile中Project字段有记录qmake对于xxx.pro文件的相对路径,所以先前qmake生成的Makefile文件中记录的xxx.pro是在当前目录中,后来拷贝至影子编译目录必然找不到所需资源。
于是我将步骤修改为先创建影子编译目录,在影子编译目录中qmake,Make……这样的顺序就是正确的。
mkdir build-demo-Desktop_Qt_5_14_2_MinGW_64_bit-Release
cd build-demo-Desktop_Qt_5_14_2_MinGW_64_bit-Release
/Users/xxxx/Qt5.14.2/5.14.2/clang_64/bin/qmake -o Makefile /path/to/demo.pro -spec macx-clang CONFIG+=release CONFIG+=x86_64 CONFIG+=qtquickcompiler
/usr/bin/make -j8
Windows相同,只需把编译工具替换:
D:\Qt\Qt5.14.2\5.14.2\mingw73_32\bin\qmake.exe
D:\Qt\Qt5.14.2\Tools\mingw730_32\bin\mingw32-make.exe