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索引存在路径优先级问题,可按以下步骤修复:
- 强制指定头文件路径优先级
尽管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)。
- 清理CMake缓存并重建
旧缓存可能残留系统默认Eigen路径,执行以下命令:
rm -rf build/ cmake -S . -B build -DCMAKE_PREFIX_PATH=/home/path/to/my/prefix cmake --build build
- 修复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中指定具体版本:
- 安装不同版本到独立路径
例如:
- 将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
- 在项目中指定使用的版本
在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

