You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:15:51