天天看点

Qt6 构建系统

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调用cmake

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

有两个好消息:

  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社区将从中受益。