我试图建立一个使用qt5.6的应用程序,使qt和应用程序都是从源代码构建的(使用ninja生成器,在Windows上使用visual studio编译器,在mac上使用clang)
我被困在find_package(Qt5Core ..):当Qt尚未构建时,它将无法找到。并且因为找不到它,所以生成cmake文件不完整。
我想我需要一个设置,它会生成一个忍者文件,在构建时,构建Qt然后重新生成ninja文件(此时它会找到qt),然后继续构建。
或者我可以从源代码构建Qt +应用程序的任何其他方式,这样如果我在Qt中更改某些内容,它就会自动重建。
我应该如何设置我的cmake文件呢?
答案 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开发过程中做到这一点,我相信他们是成功的:)