gpt4 book ai didi

c++ - Cmake:将子项目目标导出到主项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:06 26 4
gpt4 key购买 nike

我目前有一个名为 LIBS 的项目,其结构如下:

├── Lib1
│ ├── CMakeLists.txt
│ ├── lib1-class.cpp
│ └── lib1-class.h
├── lib2
│ └── CMakeLists.txt
│ ├── lib2-class.cpp
│ ├── lib2-class.h
├── cmake
│ └── LIBSConfig.cmake.in
├── CMakeLists.txt

在主 cmake 文件中,我有:

install(
TARGETS
lib1
lib2
DESTINATION
${PROJECT_DIRNAME_lib}
EXPORT
${PROJECT_NAME}Exports
)

install(
EXPORT
${PROJECT_NAME}Exports
DESTINATION
${PROJECT_DIRNAME_lib}
)

因为我想将它们导出到一个可以被 find_package() 发现的包中。

我的问题是我在各自的目录中生成了 lib1lib2 并且在安装它们时,Cmake 告诉我

Error:install TARGETS given target "lib1" which does not exist in this directory.

按照建议here ,我的理解是我应该使用 Export() 并且在 lib1 和 lib2 中,有一些形式:

export(TARGETS lib1 FILE lib1Exports.cmake)

LIBS 项目中,有这样的东西:

ADD_LIBRARY(lib1 UNKNOWN IMPORTED)
set_property(TARGET lib1 PROPERTY IMPORTED_LOCATION lib1)

但是它不喜欢我对从父项目添加的这个库使用相同的名称。它告诉我:

Error:add_library cannot create imported target "lib1" because another target with the same name already exists.

所以库是可用的,我可以链接到它,等等。如果我要在父目录中创建另一个目标,但我无法安装它。

我在错误报告中发现了完全相同的问题 here但我相信 cmake 现在处理事情的方式不同,我只是没有正确地做。那我做错了吗?如果可能,我想避免使用外部包。

更新:已接受的解决方案仅适用于 lib1、lib2 之间没有依赖关系的情况。在那种情况下,应该使用提供给 this 的解决方案。问题。

最佳答案

bugreport you refer 中所述install() 命令应该从创建目标的同一目录发出。由于您在不同的目录中创建了库目标,因此您需要为它们分配不同的导出名称,因此需要分配不同的导出文件。

但是您可以自由地将这两个导出文件包含到 LIBSConfig.cmake 脚本中:

cmake/LIBSConfig.cmake:

get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
include(${SELF_DIR}/LIBS-lib1.cmake)
include(${SELF_DIR}/LIBS-lib2.cmake)

lib1/CMakeLists.txt:

add_library(lib1 ...)
install(TARGET lib1 EXPORT lib1-export ...)

lib2/CMakeLists.txt:

add_library(lib2 ...)
install(TARGET lib2 EXPORT lib2-export ...)

CMakeLists.txt:

add_subdirectory(lib1)
add_subdirectory(lib2)

install(EXPORT lib1-export FILENAME LIBS-lib1.cmake DESTINATION lib/LIBS)
install(EXPORT lib2-export FILENAME LIBS-lib2.cmake DESTINATION lib/LIBS)
install(FILES cmake/LIBSConfig.cmake DESTINATION lib/LIBS)

请注意,export命令导出 build 树。它通常不适用于 find_package,它通常用于查找已安装 文件。

关于c++ - Cmake:将子项目目标导出到主项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36037841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com