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

CMake中指定使用Eigen3.4.90的方法及版本管理疑问

问题描述

我需要使用Eigen的unsupported模块NNLS,但系统默认的Eigen 3.4.0中没有该文件,因此我下载了最新版本Eigen 3.4.90,并通过-DCMAKE_PREFIX_PATH=/home/path/to/my/prefix完成安装。

我的项目使用CMake构建,简化后的CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.16.0)
project(my_project VERSION 0.1.0)

find_package(Eigen3 3.4.90 REQUIRED NO_MODULE)

set(SOURCE_FILES main.cpp)
add_executable(my_project ${SOURCE_FILES})

target_link_libraries(my_project PUBLIC
    Eigen3::Eigen
)

我检查变量${Eigen3_DIR}确认CMake已找到正确版本,其值为/home/path/to/my/prefix/share/eigen3/cmake。但实际无法使用3.4.90版本:当我引入<eigen3/unsupported/Eigen/NNLS>时,gcc 11.3.0提示该目录不存在;引入<eigen3/Eigen/Dense>时,VSCode会跳转到usr/include下的文件,即仍识别3.4.0版本。

请问如何正确使用最新版本?另外,直接执行make install安装3.4.90会自动删除旧版本吗?未来若需保留旧版本,该如何操作?(操作系统:Ubuntu 22.04)


解决方案

一、正确使用Eigen 3.4.90的方法

你的CMake已定位到正确版本,但编译和VSCode索引存在路径优先级问题,可按以下步骤修复:

  1. 强制指定头文件路径优先级
    尽管Eigen3::Eigen目标已包含正确路径,但系统默认的/usr/include可能被优先搜索。在CMake中显式添加头目录并设置最高优先级:
target_include_directories(my_project PUBLIC
    BEFORE "${EIGEN3_INCLUDE_DIR}"
)

${EIGEN3_INCLUDE_DIR}会自动指向你安装的3.4.90头文件目录(如/home/path/to/my/prefix/include/eigen3)。

  1. 清理CMake缓存并重建
    旧缓存可能残留系统默认Eigen路径,执行以下命令:
rm -rf build/
cmake -S . -B build -DCMAKE_PREFIX_PATH=/home/path/to/my/prefix
cmake --build build
  1. 修复VSCode索引问题
    VSCode的C/C++扩展可能仍使用系统默认路径,修改.vscode/c_cpp_properties.json:
  • 将自定义Eigen路径放在includePath最前端:
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "/home/path/to/my/prefix/include/eigen3",
                "${workspaceFolder}/**"
            ],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}
  • 保存后,执行命令面板中的C/C++: Rescan Workspace重新索引。

二、make install是否会删除旧版本?

直接执行make install不会自动删除系统默认的Eigen 3.4.0。因为你将3.4.90安装到自定义路径/home/path/to/my/prefix,而系统版本位于/usr/include和/usr/share下,两者完全独立,不会互相覆盖或删除。

若你将新版本安装到/usr/local这类系统目录,则可能覆盖/usr/local下已有的Eigen文件,但不会影响/usr下的系统版本。

三、保留多个Eigen版本的操作方法

要同时保留多个版本,核心是将不同版本安装到独立自定义路径,再在CMake中指定具体版本:

  1. 安装不同版本到独立路径
    例如:
  • 将3.4.0安装到/home/xxx/eigen3.4.0
  • 将3.4.90安装到/home/xxx/eigen3.4.90
    安装时分别指定CMAKE_INSTALL_PREFIX:
# 编译安装3.4.0
cd eigen-3.4.0
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/home/xxx/eigen3.4.0
make install

# 编译安装3.4.90
cd eigen-3.4.90
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/home/xxx/eigen3.4.90
make install
  1. 在项目中指定使用的版本
    在CMakeLists.txt中,通过PATHS参数指定目标版本的配置文件路径:
# 使用3.4.90版本
find_package(Eigen3 3.4.90 REQUIRED NO_MODULE PATHS "/home/xxx/eigen3.4.90/share/eigen3/cmake")

# 切换到3.4.0版本只需修改路径
# find_package(Eigen3 3.4.0 REQUIRED NO_MODULE PATHS "/home/xxx/eigen3.4.0/share/eigen3/cmake")

这样即可在不同项目中灵活切换Eigen版本,互不干扰。


内容的提问来源于stack exchange,提问作者user90189

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:35:20