CMake中ExternalProject_Add如何将库安装到C:/ProgramFiles目录
问题原因
你当前配置会生成多份冗余副本的核心原因有两点:
- 手动将
EIGEN_INSTALL_DIR设置为项目源码目录下的${CMAKE_SOURCE_DIR}/include/eigen3,路径属于单个项目私有 - 跳过了Eigen自带的CMake安装流程,用手动拷贝头文件的方式部署,不会在系统全局留下可供其他项目识别的配置文件
实现方案
按以下步骤修改配置,即可实现一次安装、所有项目全局复用,不会重复下载:
1. 配置全局路径,替换项目私有路径
将临时构建目录放到系统全局临时路径,安装目录指向系统程序目录,注意写入C:/Program Files必须以管理员权限运行CMake/编译终端,否则会触发权限报错:
# Eigen临时构建目录放到系统临时文件夹,避免每个项目单独存一份下载缓存 set(EIGEN_BUILD_DIR $ENV{TEMP}/cmake_eigen_cache CACHE PATH "Eigen build cache" FORCE) # 全局安装目录 set(EIGEN_INSTALL_DIR "C:/Program Files/Eigen3" CACHE PATH "Eigen install path" FORCE)
如果不想用管理员权限,也可以把安装目录改成非系统盘的公共路径比如C:/dev_libs/Eigen3,后续把这个路径加到系统环境变量CMAKE_PREFIX_PATH里,所有CMake项目都能自动识别。
2. 替换手动拷贝逻辑,走Eigen官方安装流程
原来的手动拷贝逻辑会漏掉Eigen的CMake查找配置,导致后续项目无法通过find_package自动识别。把ExternalProject_Add配置修改为如下内容:
ExternalProject_Add( eigen URL https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz PREFIX ${EIGEN_BUILD_DIR} # 传入Eigen的CMake配置参数,指定安装前缀,关闭不需要的文档、测试编译 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EIGEN_INSTALL_DIR} -DEIGEN_BUILD_DOC=OFF -DEIGEN_BUILD_TESTS=OFF -DEIGEN_BUILD_EXAMPLES=OFF # 执行官方安装逻辑 INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Release TEST_COMMAND "" # 已经下载构建过就跳过更新,避免重复拉取 UPDATE_DISCONNECTED ON )
3. 增加全局查找逻辑,已安装则跳过下载构建
在引入ExternalProject逻辑前,先检测系统里是否已经安装过对应版本的Eigen,如果已经存在就直接复用,完全跳过下载、编译、安装步骤:
# 优先查找全局已安装的Eigen find_package(Eigen3 3.3.7 QUIET) if(NOT Eigen3_FOUND) include(ExternalProject) # 此处放上述ExternalProject_Add的配置 set(EIGEN_INCLUDE_DIR ${EIGEN_INSTALL_DIR}/include/eigen3) include_directories(SYSTEM ${EIGEN_INCLUDE_DIR}) add_dependencies(my_exe eigen) else() message(STATUS "Found system Eigen3, skip download and build") set(EIGEN_INCLUDE_DIR ${EIGEN3_INCLUDE_DIR}) endif() target_include_directories(my_exe PRIVATE ${EIGEN_INCLUDE_DIR})
后续使用
第一次编译完成后,Eigen就会固定存在你设置的全局目录下,后续新建任何项目都不需要再写ExternalProject相关的下载逻辑,直接写find_package(Eigen3 3.3.7 REQUIRED)即可直接引用,不会产生任何冗余副本。
内容的提问来源于stack exchange,提问作者PetrasVestartasEPFL
相关产品推荐
相关产品推荐

