是否可以将两个或多个完全独立的项目以cmake的相同包名称导出目标?
因此,例如,在独立安装多个库之后,您将可以在自己的项目中将它们链接起来,如下所示:
find_package(SharedPackageName REQUIRED COMPONENTS Lib1 Lib2)
add_executable(MyProgram "main.cpp")
target_link_libraries(MyProgram SharedPackageName::Lib1 SharedPackageName::Lib2)
这里的想法是让我所有的库成为它们自己的独立项目,并具有自己的git存储库,可以单独安装,但同时又使其看起来像是更大的“组织”库的一部分(通过安装每个库的include目录)在共享组织的父目录下,并在共享组织包名称下公开cmake目标)。类似于c ++ boost库。
我试图自己解决一个问题,但是面临的问题是,每当我安装一个库时,它就会覆盖以前的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目标“附加”到现有配置文件而不是覆盖它?
当然,只是不要将目标导出文件设置为对每个子项目使用相同的名称。而是给它们提供具有唯一前缀的所有唯一名称,例如targets-<subproj>.cmake
。然后创建一个<Project>Config.cmake
glob,用于targets-*.cmake
遍历结果列表,并对include()
每个结果进行遍历。每个子项目都安装相同的<Project>Config.cmake
文件就可以了,因为它应该始终具有相同的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句