CMake find_package无法识别foo-config.cmake的路径配置疑问
解决CMake
find_package无法找到foo-config.cmake的问题 核心问题:配置文件安装路径不符合CMake搜索规则
你当前将foo-config.cmake直接安装到lib/cmake目录,但CMake的find_package默认只会在前缀路径下的包名子目录中搜索配置文件(比如lib/cmake/foo/、share/cmake/foo/或lib/foo/cmake/),不会直接扫描lib/cmake根目录。Ubuntu 22.04自带的CMake 3.22.1完全支持这些标准路径,版本并非问题所在。
正确配置步骤
调整
install(EXPORT)的路径
修改CMakeLists.txt中的安装指令,将配置文件放到lib/cmake/foo目录下(以包名作为子目录):# 先安装库目标并导出到foo-targets install(TARGETS foo EXPORT foo-targets LIBRARY DESTINATION lib INCLUDES DESTINATION include) # 安装导出的配置文件到lib/cmake/foo install(EXPORT foo-targets FILE foo-config.cmake DESTINATION lib/cmake/foo)安装完成后,
foo-config.cmake会出现在<安装前缀>/lib/cmake/foo/路径下,完全匹配CMake的搜索规则。可选:添加版本配置文件
若要支持find_package(foo 1.0 REQUIRED)这类版本匹配需求,可生成foo-config-version.cmake并安装到同一目录:include(CMakePackageConfigHelpers) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/foo-config-version.cmake" VERSION ${FOO_VERSION} COMPATIBILITY SameMajorVersion) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/foo-config-version.cmake" DESTINATION lib/cmake/foo)
验证效果
重新安装库后,运行cmake --debug-find ..会看到CMake开始扫描<安装前缀>/lib/cmake/foo/路径,此时find_package(foo REQUIRED)即可正常找到配置文件。
自定义安装前缀说明
如果库安装到非系统默认前缀(比如/opt/foo),用户确实需要通过CMAKE_PREFIX_PATH指定前缀路径,但这是CMake的标准流程——配置文件的作用是让用户指定前缀后无需手动设置库路径、头文件路径,而非完全不需要任何前缀配置。
内容的提问来源于stack exchange,提问作者daneos
相关产品推荐
相关产品推荐

