【发布时间】:2022-01-07 10:32:43
【问题描述】:
我们按照 CMake 教程的第 11 步为库包配备了 *Config.cmake 文件。然而,我们的下游软件无法找到该库。
我们的包被称为“formfactor”[https://jugit.fz-juelich.de/mlz/libformfactor]。它提供了一个共享库(libformfactor)和一些头文件。
我们的下游代码使用
find_package(formfactor REQUIRED CONFIG)
message(STATUS "formfactor: found=${formfactor_FOUND}, include_dirs=${formfactor_INCLUDE_DIR}, "
"lib=${formfactor_LIBRARY}, version=${formfactor_VERSION}")
搜索库。唉,它打印出来了
formfactor: found=1, include_dirs=/usr/local/include, lib=, version=0.1
也就是说,它没有找到库,尽管我们说“需要”,但它没有引发致命错误。
包“formfactor”包含以下所有内容:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.6 FATAL_ERROR)
project(formfactor VERSION 0.1.1 LANGUAGES CXX)
if(NOT DEFINED BUILD_SHARED_LIBS)
option(BUILD_SHARED_LIBS "Build as shared library" ON)
endif()
option(WERROR "Treat warnings as errors" OFF)
add_subdirectory(ff)
install(EXPORT formfactorTargets
FILE formfactorTargets.cmake
DESTINATION cmake
)
include(CMakePackageConfigHelpers)
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/formfactorConfig.cmake"
INSTALL_DESTINATION cmake
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/formfactorConfigVersion.cmake"
VERSION "${formfactor_VERSION_MAJOR}.${formfactor_VERSION_MINOR}"
COMPATIBILITY AnyNewerVersion
)
install(FILES
${PROJECT_BINARY_DIR}/formfactorConfig.cmake
${PROJECT_BINARY_DIR}/formfactorConfigVersion.cmake
DESTINATION cmake)
export(EXPORT formfactorTargets
FILE ${CMAKE_CURRENT_BINARY_DIR}/formfactorTargets.cmake
)
Config.cmake.in:
set(formfactor_INCLUDE_DIR @CMAKE_INSTALL_PREFIX@/include)
include(${CMAKE_CURRENT_LIST_DIR}/formfactorTargets.cmake)
ff/CMakeLists.txt:
set(lib formfactor)
set(${lib}_LIBRARY ${lib} PARENT_SCOPE)
file(GLOB src_files *.cpp)
set(api_files Polyhedron.h PolyhedralTopology.h PolyhedralComponents.h)
add_library(${lib} ${src_files})
target_include_directories(${lib}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
set_target_properties(
${lib} PROPERTIES
OUTPUT_NAME ${lib}
VERSION ${formfactor_VERSION}
SOVERSION ${formfactor_VERSION_MAJOR})
install(
TARGETS ${lib}
EXPORT formfactorTargets
LIBRARY DESTINATION lib
RUNTIME DESTINATION lib
ARCHIVE DESTINATION lib)
install(
FILES ${api_files}
DESTINATION include/ff)
有什么问题吗?有什么遗漏吗?为什么还不行?
披露:
- 来自https://discourse.cmake.org/t/find-package-config-mode-wont-find-library/4573 的交叉发帖。
- 看过相关讨论Create CMake/CPack <Library>Config.cmake for shared library。在这里,我对一个可以完成 CMake 教程中推荐的所有自动文件生成的解决方案感兴趣。
【问题讨论】:
-
您为什么期望对
find_package(formfactor)的调用会设置formfactor_LIBRARY变量?你的脚本Config.cmake.in没有设置它。 -
CMake 教程中第 11 步还有什么目的?
-
无论如何,如果没有“EXPORT ..Targets”开销,我会很高兴。如果我知道如何在
Config.cmake.in中设置formfactor_LIBRARY。 -
find_package(formfactor)的“现代”用法是与formfactortarget (通过add_library调用和安装)。精确生成的脚本formfactorTargets.cmake负责创建该目标。与目标的链接关心包含目录、库和其他一些东西。find_package的“旧”使用模式是使用*_LIBRARY和*_INCLUDE_DIRECTORIES变量。脚本formfactorTargets.cmake不会创建这些变量,因此应在Config.cmake.in中设置它们。 -
“那么我们需要在下游进行哪些更改以找到格式因子包含目录并进行链接?” - 正如我上面所说,下游只需要
target_link_libraries(<downstream_exe> PUBLIC formfactor)。该命令将添加包含目录、库和其他所有内容。
标签: c++ cmake deployment