使用Qt5问题为上游项目CMake包配置文件

时间:2017-04-07 15:07:21

标签: cmake qt5 transitive-dependency

我正在开发一个使用CMake并依赖于Qt的更大的C ++库。 我们从Qt4转到Qt5,现在我在使用lib时遇到了问题 在上游项目中。作为演示问题的最小工作示例,请查看此回购:

https://github.com/philthiel/cmake_qt5_upstream

它包含两个独立的CMake项目:

  • MyLIB:一个使用Qt5 :: Core的QString的小型库。

    它生成并安装包配置文件 MyLIBConfig.cmake,MyLIBConfigVersion.cmake和MyLIBTargets.cmake 为了可以通过CMake find_package()

  • 进行搜索
  • MyAPP:一个很小的可执行文件,取决于MyLIB

    项目使用find_package(MyLIB)并创建一个使用MyLIB的可执行文件

问题是,在配置MyAPP项目时,CMake给出了以下错误消息:

CMake Error at CMakeLists.txt:11 (add_executable):
   Target "MyAPP" links to target "Qt5::Core" but the target was not found.
   Perhaps a find_package() call is missing for an IMPORTED target, or an
   ALIAS target is missing?

此行为的原因是在自动生成的MyLIBTargets.cmake文件中,Qt5 Core的INTERFACE_LINK_LIBRARIES条目是Qt5 :: Core符号。使用Qt4,此处指定了Qt核心库的绝对路径。

现在,我只需使用

即可解决此问题
find_package(Qt5Core 5.X REQUIRED) 
在MyAPP项目中。

但是,我想知道这是否是预期的/通用的方式,即请求我们的lib的上游项目自己搜索所需的传递Qt5依赖项,或者如果我可能在这里滥用CMake并需要更改我的配置程序?

关于包文件生成的CMake文档

https://cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html

提到宏可以由包配置文件提供给上游。也许这将是搜索Qt5等导入目标的正确位置,并在找不到这些依赖项时中断上游配置运行?

最佳, 菲利普

1 个答案:

答案 0 :(得分:1)

[编辑编辑]完整来源示例

您需要为项目提供CMake配置文件,并且可能应该通过CMake本身生成ConfigFile(因为您无法知道用户将安装软件的位置)。

提示,使用ECM cmake模块来简化其创建:

 find_package(ECM REQUIRED NO_MODULE)
 include(CMakePackageConfigHelpers)

 ecm_setup_version(${PROJECT_VERSION}
    VARIABLE_PREFIX ATCORE
    VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/atcore_version.h"
    PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5AtCoreConfigVersion.cmake"
    SOVERSION 1
)

 configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/KF5AtCoreConfig.cmake.in"
                               "${CMAKE_CURRENT_BINARY_DIR}/KF5AtCoreConfig.cmake"
                          INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
  )

和KF5AtCoreConfig.cmake.in:

@PACKAGE_INIT@

find_dependency(Qt5Widgets "@REQUIRED_QT_VERSION@")
find_dependency(Qt5SerialPort "@REQUIRED_QT_VERSION@")
find_dependency(KF5Solid "@KF5_DEP_VERSION@")

include("${CMAKE_CURRENT_LIST_DIR}/KF5AtCoreTargets.cmake")

这将生成包含所有依赖项的正确FindYourSortware.cmake。

[edit]更好地解释发生了什么。 如果您提供的库将使用Qt,并且还需要在填写用户来源之前找到Qt5库,则需要为自己提供一个FindYourLibrary.cmake代码,该代码将调用

 find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets Whatever)

现在,如果您的可执行文件需要链接,请使用“组件”而不是现在的方式。

find_package(Qt5 REQUIRED COMPONENTS Core)

然后用

链接你的库
 target_link_libraries(YourTarget Qt5::Core)