如何在CMake构建的C++项目中添加仅头文件库Cereal
问题根因
ExternalProject_Add的PREFIX参数仅用于指定外部项目的本地工作根目录,不会自动将你传入的${CMAKE_INSTALL_PREFIX}作为安装前缀传递给cereal的CMake配置流程,cereal默认使用/usr/local作为安装路径,这是问题的核心诱因。
解决方案1:修正ExternalProject配置
修正后的配置如下:
include(ExternalProject) # 自定义cereal安装路径,可根据需求修改 set(CEREAL_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/cereal CACHE PATH "Cereal install directory") ExternalProject_Add(cereal-external GIT_REPOSITORY https://github.com/USCiLab/cereal.git GIT_TAG v1.3.2 # 固定版本号避免兼容性问题 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CEREAL_INSTALL_DIR} # 显式传递安装前缀 -DJUST_INSTALL_CEREAL=ON -DSKIP_PORTABILITY_TEST=ON -DBUILD_TESTS=OFF PREFIX ${CMAKE_BINARY_DIR}/thirdparty/cereal # 工作目录放构建路径下,避免污染源码/安装目录 ) # 声明导入目标,方便项目直接链接使用 add_library(cereal INTERFACE IMPORTED GLOBAL) add_dependencies(cereal cereal-external) set_target_properties(cereal PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CEREAL_INSTALL_DIR}/include )
后续你的项目需要使用cereal时,直接添加如下配置即可:
target_link_libraries(你的项目目标 PRIVATE cereal)
更简单的替代方案:FetchContent集成
如果不需要将cereal单独安装到系统路径,使用CMake 3.11及以上版本支持的FetchContent模块可以完全规避安装路径配置问题,配置更简洁:
include(FetchContent) FetchContent_Declare(cereal GIT_REPOSITORY https://github.com/USCiLab/cereal.git GIT_TAG v1.3.2 ) # 提前设置cereal编译选项,跳过冗余构建内容 set(JUST_INSTALL_CEREAL ON CACHE BOOL "" FORCE) set(SKIP_PORTABILITY_TEST ON CACHE BOOL "" FORCE) set(BUILD_TESTS OFF CACHE BOOL "" FORCE) FetchContent_MakeAvailable(cereal)
该方案下无需处理安装逻辑,也不需要额外配置头文件路径,直接用target_link_libraries(你的项目目标 PRIVATE cereal)即可正常使用cereal。
内容的提问来源于stack exchange,提问作者Armut
相关产品推荐
相关产品推荐

