2020年10月12日(星期一)约尔格·博内曼 | 评论意见
Cmake是qt 6的构建系统。
用于构建Qt6的工具是CMake。
科马克
- 广泛改编和提供。
这些天它甚至随VisualStudio一起发布。 - 由一个繁荣的社区支撑。
许多第三方库的包是可用的。 - 稳定成熟。
明年,它将获准在美国饮用酒精饮料。
CMake3.18.4最近发布。请用那个来建造QT。
使用配置或普通CMake
我们亲爱的configure
剧本仍然存在。它接受您习惯使用的Qt 5中的大多数选项。
目前,qmake构建系统还在。您可以在使用qmake或cmake建立QT之间进行选择。经过-cmake
配置为使用基于CMake的构建。
对于最终版本,预期qmake构建系统将随着传递的需要一起消失。-cmake
.
例如,下面的调用将Qt配置为~/QT/6.0.0,并关闭对QLCDNumber
小部件并跳过Qtsvg储存库:
configure -cmake -prefix /opt/Qt/6.0.0 -no-feature-lcdnumber -skip qtsvg
配置脚本将这些参数转换为以下CMake调用:
cmake -GNinja -DCMAKE_INSTALL_PREFIX=/opt/Qt/6.0.0 -DFEATURE_lcdnumber=OFF -DBUILD_qtsvg=OFF /path/to/qt/sources
这是一个相当大的嘴巴,并说明了我们的配置脚本的有用性。
通过配置,我们可以在--
争论。上面的配置调用相当于以下内容:
configure -cmake -prefix ~/Qt/6.0.0 -no-feature-lcdnumber -- -DBUILD_qttools=OFF
配置后,使用cmake --build .
或ninja
来建造这个项目。
我们建议使用CMake的忍者发生器。这也是配置的默认设置。
您可以通过传递来指定cmake生成器。-cmake-generator <name>
使用另一个生成器-cmake-use-default-generator
使用CMake的默认生成器,即否-G <generator>
论点通过了。
使用cmake --install .
安装QT。
交叉编译qt
要用CMake交叉编译一个项目,必须指定一个工具链文件。这个CMake语言文件为平台名称、使用的编译器/链接器和其他一系列特定于工具链的东西设置了正确的值。
工具链文件的概念类似于qmake的mkspecs。
阅读有关工具链文件的更多信息。CMake交叉编译文档.
让我们来看看如何在Linux上构建一个Qt。
configure -cmake -prefix /opt/Qt/6.0.0-android \
-qt-host-path /opt/Qt/6.0.0 \
-xplatform android-clang \
-android-ndk ~/Android/android-sdk-tools/ndk-bundle \
-android-sdk ~/Android/android-sdk-tools \
-android-abis armeabi-v7a
最显著的区别是-qt-host-path
选择。要跨构建Qt,您需要指向已经存在的本地构建宿主平台。这叫做宿主QT.
所有本地主机工具,如MOC、RCC和UIC都是从那里运行的。
在Qt 5中,我们为每一个交叉构建重新构建了主机工具。重新使用现有主机Qt安装中的主机工具,可以避免一次又一次地为每次交叉构建构建主机工具,并极大地简化了Qt的构建系统。
跨构建的qt不为目标平台构建主机工具,除非设置cmake变量。QT_BUILD_TOOLS_WHEN_CROSS_COMPILING
到ON
。这样做在嵌入式Linux环境中很有用。
这个-xplatform android-clang
参数只会影响为该跨构建提供qmake支持而生成的配套文件。
这个-android-ndk
参数指向NDK并选择位于其中的CMake工具链文件。
这个-android-sdk
参数指向SDK。
这个-android-abis
参数选择我们将要构建的ABI。注意,还没有实现多个ABI构建。
为了将所有内容组合在一起,上面的配置调用被转换为以下CMake调用:
cmake -DQT_HOST_PATH=/opt/Qt/6.0.0 \
-DQT_QMAKE_TARGET_MKSPEC=android-clang \
-DANDROID_SDK_ROOT=/home/jobor/Android/android-sdk-tools \
-DCMAKE_TOOLCHAIN_FILE=/home/jobor/Android/android-sdk-tools/ndk-bundle/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=armeabi-v7a \
-DCMAKE_INSTALL_PREFIX=/opt/Qt/6.0.0-android \
-G Ninja \
/path/to/qt/source
再一次,用cmake --build .
或者只是ninja
.
使用cmake --install .
安装QT。
构建基于QT的项目
一旦安装了Qt,就可以使用CMake或qmake构建项目。
与qmake的一切照旧:
mkdir ~/my-project-build
cd ~/my-project-build
/opt/Qt/6.0.0/bin/qmake
make
注意:这也适用于交叉构建。在这里,qmake是一个包装脚本,它使用生成的qt.conf来调用主机Qt的qmake可执行文件,该脚本设置正确的路径和mkspec。
Qt附带了一个名为qt-cmake的包装脚本,以提供类似的CMake体验:
mkdir ~/my-project-build
cd ~/my-project-build
/opt/Qt/6.0.0/bin/qt-cmake
cmake --build .
Qt-cmake调用cmakeCMAKE_TOOLCHAIN_FILE
变量设置为Qt内部工具链文件,该文件设置正确的编译器,并在交叉编译情况下链接加载“真实”工具链文件。
注意:如果您发现自己需要链接一个不同的工具链文件,请传递-DQT_CHAINLOAD_TOOLCHAIN_FILE=<file-path>
去qt-cmake。
Qt-cmake不设置CMake发生器。如果您总是想使用忍者-我们推荐的-设置环境变量CMAKE_GENERATOR
到Ninja
.
构建QT模块
qt-configure-module
是在针对已安装的QT单独构建Qt模块时所选择的工具。这个qt-configure-module
脚本采用相同的参数,顶级Qt配置调用将限制于应用于我们当前配置的模块的参数。
在下面的示例中,我们首先构建和安装qtbase,然后关闭qml网络特性的qt声明性。
mkdir ~/dev/qt/qtbase-build
cd ~/dev/qt/qtbase-build
../qtbase/configure -prefix /opt/Qt/6.0.0
cmake --build .
cmake --install .
mkdir ~/dev/qt/qtdeclarative-build
cd ~/dev/qt/qtdeclarative-build
/opt/Qt/6.0.0/bin/qt-configure-module ../qtdeclarative -no-qml-network
cmake --build .
cmake --install .
建筑独立测试与实例
如果您是Qt贡献者,侵入了Qt的某些部分,您可能希望扩展并运行覆盖该领域的自动测试。但是大多数人总是用-ameake测试来配置Qt,因为配置和构建测试需要一些时间。
有两个好消息:
- 现在不构建所有测试是默认的!不需要通过
-nomake tests
更多。同样的也适用于-nomake examples
.
如果你真的想建造全测试和示例,通过-make tests -make examples
争论。我们相信,新的默认设置将导致更少类型的命令行字符,从而为更有趣的调用节省这一稀缺资源。 - 配置和构建单个自动测试或示例很容易。
这就是如何构建和运行QProcess的自动测试:
mkdir ~/dev/qt/tst_qprocess
cd ~/dev/qt/tst_qprocess
/opt/Qt/6.0.0/bin/qt-cmake-standalone-test ../qtbase/tests/auto/corelib/io/qprocess
cmake --build .
ctest -V
这使用了CMake附带的ctest工具,当然,您也可以直接运行可执行文件。
构建一个示例以类似的方式工作:
mkdir ~/dev/qt/wiggly
cd ~/dev/qt/wiggly
/opt/Qt/6.0.0/bin/qt-cmake ../qtbase/examples/widgets/widgets/wiggly
cmake --build .
./wiggly
将基于qmake的项目移植到cmake
如果您正在寻找一种方法来轻松地将您基于qmake的项目移植到CMake,我有好消息和坏消息给您。
好消息
没有立即需要将您的项目移植到CMake。
QMake继续在Qt6工作。
坏消息
没有好的移植工具可用。
Qt本身(在某种程度上仍然是如此)使用一个名为Python的脚本移植到CMake前2c.
该脚本是根据Qt模块项目文件的结构定制的,虽然它可能有助于为用户项目创建一个起点,但这与我们重新推荐的内容相去甚远。
如果遇到一些聪明的qmake结构,它可能就会突然消失。
但是如果你是喜欢冒险的人,可以自由地尝试一下,并确保通过--is-example
争论。
结语
我们希望向CMake的转换对您来说是尽可能顺利的,Qt和CMake社区将从中受益。