Cmake:将子项目目标导出到主项目
Cmake: Exporting subproject targets to main project
我目前有一个名为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() 可发现的包中。
我的问题是我在各自的目录中生成lib1
和lib2
,并且在安装它们时,Cmake 告诉我
Error:install TARGETS given target "lib1" which does not exist in this directory.
正如这里所建议的,我的理解是我应该使用 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.
所以库是可用的,如果我要在父目录中创建另一个目标,我可以链接到它,但我无法安装它。
我在这里的错误报告中发现了完全相同的问题,但我相信 cmake 现在以不同的方式处理事情,我只是没有正确做。那么我做错了吗?如果可能的话,我想避免使用外部包。
更新:接受的解决方案仅适用于lib1,lib2之间没有依赖关系的情况。在这种情况下,应该使用为此问题提供的解决方案。
如错误报告中所述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)
请注意,导出命令会导出构建树。它通常不适合find_package
,通常用于查找已安装的文件。
相关文章:
- CMake:防止在子目录库项目中生成测试可执行目标
- 无法为不是由该项目生成的目标指定链接库
- 如何为在 x86 主机上为 arm 目标交叉编译的项目安装依赖项
- CMake:如何更改子目录项目目标的属性?
- Cmake :几个使用自定义目标进行测试的项目
- 在QT中的大型项目中指定构建/目标/安装路径
- CMake 将目标作为项目的一部分独立构建
- 使用 CMake 外部项目为跨平台库依赖项的目标名称
- 如何使用于 catch2 测试和项目运行的 cmake 目标更具可扩展性和合理性?
- 如何获取外部项目定义的目标的输出路径?
- 使用解决方案上的msbuild来调用某些项目上的自定义目标
- qtmake-两个项目/目标之间的共享资源
- Cmake:将子项目目标导出到主项目
- 在使用 Xbuild 编译 Visual C++ 项目时定义目标
- 在目标 c 项目中包含 cpp 类的逻辑
- EclipseCDT-带有现有代码的新Makefile项目-更改全局默认构建目标
- Qt创建者中的通用c++项目-没有使目标成为目标的规则
- CMake嵌套项目和目标
- 使用opencv框架的目标C项目的最佳编译器标志
- 裸机目标与cmake项目链接错误