如何使用CMake FetchContent或ExternalProject引入CppADCodeGen?
CMake FetchContent与ExternalProject使用问题解答
核心问题结论
该说法不正确,通过ExternalProject引入Eigen后完全可以自定义导入目标Eigen3::Eigen,实现和FetchContent一致的target_link_libraries链接用法,无需手动逐个添加头文件路径。
一、FetchContent阶段常见问题修复
针对你之前遇到的两类报错,可通过以下配置提前规避:
- 多库同名
uninstall目标冲突
FetchContent引入的第三方库默认会将库的顶级目标暴露到父项目,多个库定义同名
uninstall目标会触发冲突。可在拉取依赖前通过全局配置关闭第三方库的非必要目标编译:
# 全局设置,避免第三方库自定义目标污染父项目命名空间 set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) # 用set变量覆盖第三方库的option配置 set(BUILD_TESTING OFF CACHE BOOL "" FORCE) # 关闭Eigen的非必要目标 set(EIGEN_BUILD_DOC OFF CACHE BOOL "" FORCE) set(EIGEN_BUILD_TESTING OFF CACHE BOOL "" FORCE) set(EIGEN_SKIP_INSTALL_RULES ON CACHE BOOL "" FORCE) # 关闭CppAD的非必要目标 set(CPPAD_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(CPPAD_INSTALL OFF CACHE BOOL "" FORCE)
- CppADCodeGen无法识别FetchContent引入的CppAD
该问题是因为CppADCodeGen的FindCppAD脚本默认只搜索系统安装路径和CMAKE_PREFIX_PATH下的配置,不会识别FetchContent拉取但未安装的CppAD源码。可在引入CppADCodeGen前手动填充FindCppAD需要的变量:
FetchContent_MakeAvailable(cppad) set(CPPAD_INCLUDE_DIR "${cppad_SOURCE_DIR}/include" CACHE PATH "" FORCE) set(CPPAD_VERSION "20210000.8" CACHE STRING "" FORCE) set(CPPAD_FOUND TRUE CACHE BOOL "" FORCE)
二、ExternalProject导入Eigen并生成Eigen3::Eigen目标的实现方法
ExternalProject只会在构建阶段拉取编译依赖,需要手动创建IMPORTED类型的导入目标,完整配置示例如下:
include(ExternalProject) set(EIGEN_VERSION "3.4.0") set(EIGEN_INSTALL_DIR "${CMAKE_BINARY_DIR}/thirdparty/eigen-install") ExternalProject_Add( eigen_external # 此处填写Eigen对应版本的源码包地址 URL "your eigen source package path/url" CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EIGEN_INSTALL_DIR} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DBUILD_TESTING=OFF -DEIGEN_BUILD_DOC=OFF -DEIGEN_BUILD_PKGCONFIG=OFF UPDATE_COMMAND "" TEST_COMMAND "" ) # 手动创建全局导入目标,用法和FetchContent生成的目标完全一致 add_library(Eigen3::Eigen INTERFACE IMPORTED GLOBAL) add_dependencies(Eigen3::Eigen eigen_external) set_target_properties(Eigen3::Eigen PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${EIGEN_INSTALL_DIR}/include/eigen3" )
配置完成后可直接正常链接目标,无需手动添加头文件路径:
add_executable(your_project_target main.cpp) target_link_libraries(your_project_target PRIVATE Eigen3::Eigen)
内容的提问来源于stack exchange,提问作者fdev
相关产品推荐
相关产品推荐

