Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 使用Qt5问题为上游项目制作软件包配置文件 我正在使用一个更大的C++库,它使用cFug并依赖于Qt。 我们从Qt4迁移到Qt5,现在我在使用lib时遇到了一个问题 在上游项目中。作为说明问题的最低工作示例,请查看此回购协议:_Cmake_Qt5_Transitive Dependency - Fatal编程技术网

Cmake 使用Qt5问题为上游项目制作软件包配置文件 我正在使用一个更大的C++库,它使用cFug并依赖于Qt。 我们从Qt4迁移到Qt5,现在我在使用lib时遇到了一个问题 在上游项目中。作为说明问题的最低工作示例,请查看此回购协议:

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

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

  • 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键。我正在用一个完整的例子来更新答案,说明如何处理这个问题。我可以邀请你参加我的回购协议吗,那么你就不必再写一个新的例子了?只是为了节省您的时间。我从我的项目中复制了您想要的内容。:)太好了,我非常感谢你的帮助,谢谢!