Qt6 构建系统

31 篇文章 8 订阅

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_COMPILINGON。这样做在嵌入式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_GENERATORNinja.

构建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,因为配置和构建测试需要一些时间。

有两个好消息:

  1. 现在不构建所有测试是默认的!不需要通过-nomake tests更多。同样的也适用于-nomake examples
    如果你真的想建造测试和示例,通过-make tests -make examples争论。我们相信,新的默认设置将导致更少类型的命令行字符,从而为更有趣的调用节省这一稀缺资源。
  2. 配置和构建单个自动测试或示例很容易。

这就是如何构建和运行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社区将从中受益。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值