我目前有一个名为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)
注意,export命令导出构建树。通常不适用于find_package
,通常用于查找已安装的文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句