Cmake 使用Qt5问题为上游项目制作软件包配置文件 我正在使用一个更大的C++库,它使用cFug并依赖于Qt。 我们从Qt4迁移到Qt5,现在我在使用lib时遇到了一个问题 在上游项目中。作为说明问题的最低工作示例,请查看此回购协议:
它包含两个单独的CMake项目:Cmake 使用Qt5问题为上游项目制作软件包配置文件 我正在使用一个更大的C++库,它使用cFug并依赖于Qt。 我们从Qt4迁移到Qt5,现在我在使用lib时遇到了一个问题 在上游项目中。作为说明问题的最低工作示例,请查看此回购协议:,cmake,qt5,transitive-dependency,Cmake,Qt5,Transitive Dependency,它包含两个单独的CMake项目: MyLIB:一个使用Qt5::Core中的QString的小型库 它生成并安装包配置文件 MyLIBConfig.cmake、MyLIBConfigVersion.cmake和MyLIBTargets.cmake 为了便于CMake find_package()搜索 MyAPP:一个依赖于MyLIB的小型可执行文件 该项目使用find_包(MyLIB)并创建一个使用MyLIB的可执行文件 问题是,在配置MyAPP项目时,CMake会给我以下错误消息: CM
- MyLIB:一个使用Qt5::Core中的QString的小型库 它生成并安装包配置文件 MyLIBConfig.cmake、MyLIBConfigVersion.cmake和MyLIBTargets.cmake 为了便于CMake find_package()搜索
- MyAPP:一个依赖于MyLIB的小型可执行文件 该项目使用find_包(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的接口链接库条目是Qt5::Core符号。使用Qt4,这里指定了Qt核心库的绝对路径
现在,我可以通过使用
find_package(Qt5Core 5.X REQUIRED)
在MyAPP项目中
但是,我想知道这是否是预期的/通用的方法,即请求我们lib的上游项目搜索所需的可传递Qt5依赖项本身,或者我是否可能在此处滥用CMake,需要更改配置过程
CMake docu在包文件生成中的作用
提到可以通过包配置文件向上游提供宏。也许这是搜索导入目标(如Qt5)的正确位置,并在未找到这些依赖项时中断上游配置运行
最好的,
Philipp[编辑的编辑]完整源代码示例 您需要为您的项目提供一个CMake配置文件,而且该配置文件可能应该通过CMake本身生成(因为您无法知道舒尔用户将在哪里安装您的软件) 提示:使用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
[编辑]更好地解释发生了什么。
如果您提供的库将使用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)
谢谢你的快速回复!!可执行文件只是一个例子。为正确起见,我确实为我的库包配置文件提供了一个自定义查找模块或相应的宏,用于搜索我拥有的任何可传递依赖项,并在上游搜索我的库时发出一个错误,而这些依赖项找不到?抱歉,我在实际完成编写之前按了enter键。我正在用一个完整的例子来更新答案,说明如何处理这个问题。我可以邀请你参加我的回购协议吗,那么你就不必再写一个新的例子了?只是为了节省您的时间。我从我的项目中复制了您想要的内容。:)太好了,我非常感谢你的帮助,谢谢!