【问题标题】:is it possible for multiple projects to export targets under the same package name?多个项目是否可以以相同的包名导出目标?
【发布时间】:2021-03-01 04:20:00
【问题描述】:

两个或多个完全独立的项目是否可以在 cmake 中以相同的包名称导出目标?

例如,在独立安装多个库后,您可以在自己的项目中与它们链接,如下所示:

find_package(SharedPackageName REQUIRED COMPONENTS Lib1 Lib2)

add_executable(MyProgram "main.cpp")
target_link_libraries(MyProgram SharedPackageName::Lib1 SharedPackageName::Lib2)

这里的想法是让我的所有库成为他们自己的独立项目,拥有自己的 git 存储库,可以单独安装,但同时使它们看起来是更大“组织”库的一部分(通过安装每个库包括共享组织父目录下的目录,并在共享组织包名称下公开 cmake 目标)。类似于c++ boost libraries

我尝试自己制定解决方案,但我面临的问题是,每当我安装其中一个库时,它都会覆盖以前的 cmake 配置文件,因为它们使用相同的名称:

project("SharedPackageName")
set(LIB_NAME "Lib1")

add_library("${LIB_NAME}" "src/libsrc.cpp")

target_include_directories("${LIB_NAME}" PUBLIC "include")

install(DIRECTORY "${CMAKE_SOURCE_DIR}/include/${PROJECT_NAME}/${LIB_NAME}"
        DESTINATION "include/${PROJECT_NAME}")

install(TARGETS "${LIB_NAME}" 
        EXPORT "${PROJECT_NAME}Config" 
        DESTINATION "lib")

install(EXPORT "${PROJECT_NAME}Config" 
        NAMESPACE "${PROJECT_NAME}::"
        DESTINATION "lib/cmake/${PROJECT_NAME}")

是否有可能使 cmake 将目标“附加”到现有配置文件而不是覆盖它?

【问题讨论】:

    标签: cmake


    【解决方案1】:

    当然,只是不要将目标导出文件设置为对每个子项目使用相同的名称。取而代之的是,给它们所有唯一的名称,并带有一个共同的前缀,例如targets-<subproj>.cmake。然后创建一个<Project>Config.cmake,它为targets-*.cmake 提供全局变量并遍历结果列表,include()-ing 每个。如果每个子项目都安装相同的<Project>Config.cmakefile 也没关系,因为它应该始终具有相同的内容。

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2020-11-25
      • 2018-05-09
      • 2019-05-18
      • 2021-03-19
      相关资源
      最近更新 更多