我试图弄清楚如何编写一个可以通过调用find_package()
另一个项目来使用的库。我正在尝试遵循Catch2存储库CMake文件。
这是我提出的一个最低版本:(git repo在这里可用)
cmake_minimum_required(VERSION 3.14.4)
set(project_name "hello")
project(${project_name} LANGUAGES CXX)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
add_library(${project_name} STATIC)
target_sources(${project_name} PRIVATE "src/hello.cpp")
target_include_directories(${project_name}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/src/>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
install(
DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/src/
DESTINATION include
FILES_MATCHING REGEX "src/.+\.h"
PERMISSIONS
OWNER_READ
GROUP_READ
WORLD_READ)
set(PROJECT_CMAKE_CONFIG_DESTINATION ${CMAKE_INSTALL_LIBDIR}/../)
configure_package_config_file(
${CMAKE_CURRENT_LIST_DIR}/cmake/${project_name}Config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${project_name}Config.cmake
INSTALL_DESTINATION
${PROJECT_CMAKE_CONFIG_DESTINATION})
install(
TARGETS
${project_name}
EXPORT
${project_name}Targets
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
install(
EXPORT
${project_name}Targets
NAMESPACE
${project_name}::
DESTINATION
${PROJECT_CMAKE_CONFIG_DESTINATION})
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/${project_name}Config.cmake"
DESTINATION
${PROJECT_CMAKE_CONFIG_DESTINATION})
然后我安装正在使用:
- cmake -DCMAKE_INSTALL_PREFIX:PATH="C:\tmp\install"
- cmake --build . --install target
一切似乎都被复制到正确的路径。但是,当我尝试find_package()
从消耗我的测试库的另一个项目中使用时,出现以下错误:
CMake Error at C:/tmp/install/helloTargets.cmake:76 (message):
The imported target "hello::hello" references the file
"C://lib/hello.lib"
but this file does not exist. Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
"C:/tmp/install/helloTargets.cmake"
but not all the files it references.
Call Stack (most recent call first):
C:/tmp/install/helloConfig.cmake:33 (include)
CMakeLists.txt:15 (find_package)
似乎缺少cmake安装目录的路径。如何修改安装功能,以便可以使用生成的配置文件find_package()
?
在您的CMakeLists.txt中,现阶段有些奇怪的事情:
target_include_directories(${project_name}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/src/>
# there is no header in this folder so this has no effect
# maybe create a include/ folder to make it more "legit"
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
您应该在target_sources中沿着.cpp指定头文件。这有2种效果:
在helloConfig.cmake.in中
if(NOT TARGET hello::hello)
我认为,当您使用configure_package_config_file()时,生成的导出文件具有某些逻辑可以防止多重包含。
最后,我认为您的主要问题是由于PROJECT_CMAKE_CONFIG_DESTINATION的位置引起的,如果删除最后一个“ /”,我认为它应该可以解决问题。
编辑13.06:由于PROJECT_CMAKE_CONFIG_DESTINATION设置为“ lib /../”,有关CMake如何计算相对路径的一些文档,计算所有相对路径的基本路径是错误的
您尝试使用“ $ {CMAKE_INSTALL_LIBDIR} /../”实现的实际上是“。”。因此基本路径为$ {CMAKE_INSTALL_PREFIX}。一种替代方法是安装在$ {CMAKE_INSTALL_LIBDIR} / cmake之类的子文件夹中,或者也可以安装在“ cmake”中
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句