使用cmake

时间:2018-04-12 15:04:13

标签: qt cmake

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

我被困在find_package(Qt5Core ..):当Qt尚未构建时,它将无法找到。并且因为找不到它,所以生成cmake文件不完整。

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

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

我应该如何设置我的cmake文件呢?

2 个答案:

答案 0 :(得分:3)

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

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

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}
)

答案 1 :(得分:3)

Qt 5的问题在于它不使用cmake进行构建,因此您的忍者构建过程对Qt的内部一无所知,除非您将其全部告知。例如。如果您更改了Qt的任何依赖关系,或者如果Qt被部分构建,则必须向项目的构建系统中添加很多知识,以确定是否需要再次调用Qt构建。可以肯定的是,它可以以“即发即弃”的构建方式工作,该构建始终像CI系统一样从头开始。如果要更改Qt本身并重新运行构建,则会很快遇到严重麻烦。由于qmake中的基本体系结构决策,即使Qt自己的构建系统在完全依赖项跟踪方面也存在严重的麻烦。

基于Qmake的开发人员重新构建了Qt吸吮-他们这样做的程度使我不必为该项目做任何贡献,因为这就像种苦恼,对一个源文件进行最简单的更改将需要花费大量时间。一分钟或更长的时间来重建,对qmake项目文件的任何更改有时都会演变成数分钟的事务。

我发现唯一有效且不会让您讨厌生活,宇宙和一切的解决方案是使用cmake重新实现Qt的构建配置系统,因此不需要qmake 。结果,启用了所有功能的qtbase静态链接的统一调试版本需要花费几分钟的时间-它相当的zippy,并且比Windows上的Qt 5为MSVC构建提供的最快选项qmake + jom快得多。

Qt项目致力于在Qt 6开发过程中做到这一点,我相信他们是成功的:)