繁体   English   中英

使用 cmake 从源代码构建应用程序和 Qt

[英]Build application and Qt from source using cmake

我试图建立一个使用 qt5.6 的应用程序,qt 和应用程序都是从源代码构建的(使用 ninja 生成器,在 windows 上使用 Visual Studio 编译器,在 mac 上使用 clang)。

我被困在 find_package(Qt5Core ..) :当 Qt 还没有构建时,它不会被找到。 并且因为没有找到,所以生成的cmake文件不完整。

我想我需要一个设置,它会生成一个 ninja 文件,该文件在构建时构建 Qt,然后在继续构建之前重新生成 ninja 文件(此时它会找到 qt)。

或者我可以从源代码构建 Qt + 应用程序的任何其他方式,以便如果我在 Qt 中更改某些内容,它会自动重建。

我应该如何设置我的 cmake 文件来做到这一点?

您可以使用 CMake 的ExternalProject命令从 CMake 中调用 CMake。 您可以在那里指定依赖项,以便您的应用程序仅在构建 Qt 之后构建。

我碰巧在这里有一个小例子,它使用ExternalProject_Add构建一个库,然后是一个应用程序。 在该示例中,库和应用程序的 CMake 在make时被调用。

cmake_minimum_required(VERSION 3.0)

include(ExternalProject)

ExternalProject_Add(cmake_lib
    URL ../cmake_lib
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
)

ExternalProject_Add(cmake_app
    DEPENDS cmake_lib
    URL ../cmake_app
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
)

Qt 5 的问题在于它不使用 cmake 来构建,因此除非您将所有内容都告诉它,否则您的 ninja 构建过程不会了解 Qt 的内部结构。 例如,如果您更改 Qt 的任何依赖项,或者如果 Qt 被部分构建,您必须向项目的构建系统添加大量知识,以确定是否需要再次调用 Qt 构建。 这当然可以在“即发即忘”的构建风格中工作,其中构建总是从头开始,就像在 CI 系统中一样。 如果目的是更改 Qt 本身并重新运行构建,那么很快就会遇到严重的麻烦。 由于 qmake 中的基本架构决策,即使 Qt 自己的构建系统在完全依赖跟踪方面也存在严重问题。

基于 Qmake 的开发人员重新构建 Qt 很糟糕 - 他们这样做的程度以至于我没有为该项目做出贡献,因为它感觉像是一种忏悔,对一个源文件的最简单的更改需要一分钟或更长时间重建,对 qmake 项目文件的任何更改有时都会变成多分钟的事务。

我发现的唯一真正有效并且不会让你讨厌生活、宇宙和一切的解决方案是使用 cmake 重新实现 Qt 的构建配置系统,这样 qmake 就变得不必要了。 因此,在启用所有功能的情况下,qtbase 的静态链接统一调试构建需要几分钟的时间 - 它非常快速,并且比 Windows 上的 Qt 5 为 MSVC 构建提供的最快选项:qmake+jom 快得多。

Qt 项目在 Qt 6 开发期间努力做到这一点,我相信他们是成功的 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM