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 多个项目是否可以以相同的包名称导出目标?_Cmake - Fatal编程技术网

Cmake 多个项目是否可以以相同的包名称导出目标?

Cmake 多个项目是否可以以相同的包名称导出目标?,cmake,Cmake,两个或多个完全独立的项目是否可以在cmake中以相同的包名导出目标 例如,在独立安装多个库之后,您可以在自己的项目中链接它们,如下所示: find_package(SharedPackageName REQUIRED COMPONENTS Lib1 Lib2) add_executable(MyProgram "main.cpp") target_link_libraries(MyProgram SharedPackageName::Lib1 SharedPackageNa

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

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

find_package(SharedPackageName REQUIRED COMPONENTS Lib1 Lib2)

add_executable(MyProgram "main.cpp")
target_link_libraries(MyProgram SharedPackageName::Lib1 SharedPackageName::Lib2)
这里的想法是让我的所有库都是他们自己的独立项目,有他们自己的git存储库,可以单独安装,但同时使它们看起来是更大的“组织”库的一部分(通过在共享组织父目录下安装每个库包含目录,并在共享组织包名称下公开cmake目标)。类似于

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

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“附加”将目标设置为现有配置文件,而不是覆盖它?

当然,只是不要将目标导出文件设置为对每个子项目使用相同的名称。相反,使用公共前缀为它们指定所有唯一的名称,如
targets-.cmake
。然后创建一个
config.cmake
全局搜索
targets-*.cmake
,并进行迭代在生成的列表上,
include()
-ing每个子项目。如果每个子项目都安装相同的
Config.cmake
文件,则没有关系,因为它应该始终具有相同的内容