适用环境:Windows 10/11、Visual Studio 2019(MSVC v142)、CMake 3.15 或更高版本。本文所有命令在x64 Native Tools Command Prompt for VS 2019(CMD)中运行,不要直接粘贴到 Git Bash 或 PowerShell。
1. Eigen 需要编译吗?
Eigen 是头文件模板库(header-only)。普通工程只需包含<Eigen/Dense>,不必生成或链接eigen.lib。CMake 主要用于安装头文件及导出Eigen3::Eigen接口目标;真正需要编译的是调用 Eigen 的应用程序或Eigen 自带的测试程序。[1][2]
| 验证方式 | 编译内容 | 用途 |
|---|---|---|
| 方式一:最小 C++ 程序 | 自己的main.cpp | 验证安装、头文件查找、VS2019 编译和运行 |
| 方式二:完整测试套件 | Eigen 官方已配置的单元测试程序 | 检验该版本在当前 MSVC 环境下的功能与兼容性 |
两种方式可以分别执行。只想在项目中使用 Eigen,完成方式一即可;要验证 Eigen 自身,则继续执行方式二。
2. 准备环境与下载源码
- 安装Visual Studio 2019,勾选“使用 C++ 的桌面开发”,确保包含MSVC v142和Windows 10 SDK。
- 安装CMake 3.15+并加入
PATH。 - 从 Eigen 3.4.1 官方发布页 下载源码压缩包,解压到
E:\eigen-3.4.1-src。[3] - 打开开始菜单中的x64 Native Tools Command Prompt for VS 2019,执行:
cmake --version cl where cmakecmake和cl能显示版本信息即可;单独运行cl时提示未提供源文件是正常现象。
检查源码目录(应当都存在):
dir "E:\eigen-3.4.1-src\CMakeLists.txt" dir "E:\eigen-3.4.1-src\Eigen\Dense"路径约定:以下假设有D:源码盘和E:安装盘;如没有对应盘符,统一替换命令中的路径。源码根目录必须是直接包含CMakeLists.txt和Eigen文件夹的目录。
3. 安装 Eigen 头文件(两种方式共用)
在 VS2019 命令提示符中执行:
① 配置
使用独立构建目录E:\eigen-3.4.1-src\build,关闭测试等无关目标。
Windows Bat
cmake -S "D:\eigen-3.4.1-src" -B "D:\eigen-3.4.1-src\build" ^ -G "Visual Studio 16 2019" -A x64 ^ -DCMAKE_INSTALL_PREFIX="E:\libEigen341" ^ -DBUILD_TESTING=OFF ^ -DEIGEN_BUILD_TESTING=OFF ^ -DEIGEN_BUILD_DOC=OFF ^ -DEIGEN_BUILD_DEMOS=OFF ^ -DEIGEN_BUILD_BLAS=OFF ^ -DEIGEN_BUILD_LAPACK=OFFLinux Shell
cmake-S"E:\eigen-3.4.1-src"-B"E:\eigen-3.4.1-src\build"\-G"Visual Studio 16 2019"-Ax64\-DCMAKE_INSTALL_PREFIX="E:\libEigen341"\-DBUILD_TESTING=OFF\-DEIGEN_BUILD_TESTING=OFF\-DEIGEN_BUILD_DOC=OFF\-DEIGEN_BUILD_DEMOS=OFF\-DEIGEN_BUILD_BLAS=OFF\-DEIGEN_BUILD_LAPACK=OFF| CMake 选项 | 功能及作用 |
|---|---|
-S "E:\eigen-3.4.1-src" | 指定 Eigen 3.4.1 源码目录,包含CMakeLists.txt。 |
-B "E:\eigen-3.4.1-src\build" | 指定构建目录,存放 CMake 缓存及生成的 VS2019 工程文件;不存在则自动创建。 |
-G "Visual Studio 16 2019" | 指定使用 Visual Studio 2019 生成器。 |
-A x64 | 指定 64 位(x64)目标平台。 |
-DCMAKE_INSTALL_PREFIX="E:\libEigen341" | 指定安装根目录;执行cmake --install后,头文件通常位于其include\eigen3子目录。 |
-DBUILD_TESTING=OFF | 关闭通用 CTest 测试配置。 |
-DEIGEN_BUILD_TESTING=OFF | 关闭 Eigen 官方单元测试工程的生成。 |
-DEIGEN_BUILD_DOC=OFF | 关闭 Eigen 文档构建,避免额外依赖 Doxygen、LaTeX。 |
-DEIGEN_BUILD_DEMOS=OFF | 关闭 Eigen 演示程序的构建。 |
-DEIGEN_BUILD_BLAS=OFF | 不构建 Eigen 提供的 BLAS 兼容库,不影响 Eigen 常规矩阵运算。 |
-DEIGEN_BUILD_LAPACK=OFF | 不构建 Eigen 提供的 LAPACK 兼容库,不影响 Eigen 自身的矩阵分解功能。 |
② 安装
cmake --install "E:\eigen-3.4.1-src\build" --config Release③ 验证文件
dir "E:\libEigen341\include\eigen3\Eigen\Dense"能够找到Dense,说明头文件已安装。头文件包含目录是...\include\eigen3,不是...\include\eigen3\Eigen。
说明:此步骤不需要先编译
ALL_BUILD,因为 Eigen 核心没有待编译的二进制库。下一节才会实际调用 MSVC 编译代码。
4. 方式一:编译最小 C++ 程序
4.1 创建示例工程
创建目录:
mkdir "D:\eigen-demo"在D:\eigen-demo下新建两个文件(注意扩展名不是.txt)。
main.cpp
#include<Eigen/Dense>#include<iostream>intmain(){Eigen::Matrix2d A;A<<1.0,2.0,3.0,4.0;Eigen::Vector2db(5.0,11.0);constEigen::Vector2d x=A.colPivHouseholderQr().solve(b);std::cout<<"Eigen "<<EIGEN_WORLD_VERSION<<'.'<<EIGEN_MAJOR_VERSION<<'.'<<EIGEN_MINOR_VERSION<<'\n';std::cout<<"x = "<<x.transpose()<<'\n';return(A*x-b).norm()<1e-10?0:1;}CMakeLists.txt
cmake_minimum_required(VERSION 3.15) project(EigenDemo LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Eigen3 3.4.1 CONFIG REQUIRED) add_executable(eigen_demo main.cpp) target_link_libraries(eigen_demo PRIVATE Eigen3::Eigen)Eigen3::Eigen是传递包含路径等信息的CMake 接口目标,不是eigen.lib。[2]
4.2 配置、编译、运行
cmake -S "D:\eigen-demo" -B "D:\eigen-demo\build" -G "Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH="E:\libEigen341" cmake --build "D:\eigen-demo\build" --config Release "D:\eigen-demo\build\Release\eigen_demo.exe"预期输出:
Eigen 3.4.1 x = 1 2程序退出码为0表示残差检查通过。若要确认退出码,紧接着执行:
echo %ERRORLEVEL%也可以打开D:\eigen-demo\build\EigenDemo.sln,选择x64 / Release编译eigen_demo。
5. 方式二:编译并运行 Eigen 完整测试套件
本流程使用独立构建目录E:\eigen-3.4.1-src\tests,不修改第 3 节的安装配置。完整测试只包括当前配置已注册、依赖条件满足的测试;没有安装的可选依赖不会自动成为可执行的测试。
5.1 启用测试并生成 VS2019 工程
Windows Bat
cmake -S "E:\eigen-3.4.1-src" -B "E:\eigen-3.4.1-src\tests" -G "Visual Studio 16 2019" -A x64 -DBUILD_TESTING=ON -DEIGEN_BUILD_TESTING=ON -DEIGEN_TEST_CXX11=ON -DEIGEN_LEAVE_TEST_IN_ALL_TARGET=OFF -DEIGEN_BUILD_DOC=OFF -DEIGEN_BUILD_DEMOS=OFF -DEIGEN_BUILD_BLAS=OFF -DEIGEN_BUILD_LAPACK=OFFLinux Shell
cmake-S"E:\eigen-3.4.1-src"-B"E:\eigen-3.4.1-src\tests"\-G"Visual Studio 16 2019"-Ax64\-DBUILD_TESTING=ON\-DEIGEN_BUILD_TESTING=ON\-DEIGEN_TEST_CXX11=ON\-DEIGEN_LEAVE_TEST_IN_ALL_TARGET=OFF\-DEIGEN_BUILD_DOC=OFF\-DEIGEN_BUILD_DEMOS=OFF\-DEIGEN_BUILD_BLAS=OFF\-DEIGEN_BUILD_LAPACK=OFF主要参数:
| 参数 | 值 | 作用 |
|---|---|---|
EIGEN_BUILD_TESTING | ON | 生成 Eigen 单元测试及测试目标 |
BUILD_TESTING | ON | 启用 CTest 测试支持 |
EIGEN_TEST_CXX11 | ON | 启用需要 C++11 的相关测试;VS2019 支持 |
EIGEN_LEAVE_TEST_IN_ALL_TARGET | OFF | 测试不放入默认ALL_BUILD;改为显式执行buildtests |
EIGEN_BUILD_DOC / DEMOS | OFF | 不构建文档、演示程序 |
EIGEN_BUILD_BLAS / LAPACK | OFF | 不构建可选 BLAS/LAPACK 接口库 |
5.2 编译整个已配置测试套件
cmake --build "E:\eigen-3.4.1-src\tests" --config Release --target buildtests --parallel 2buildtests是 Eigen 官方提供的测试聚合目标,用于编译单元测试;不要把ALL_BUILD当作完整测试的同义词。[4]
建议先用--parallel 2。测试中有大量模板实例化,若遇到 MSVCC1060、C1076或内存不足,可改为--parallel 1。
5.3 执行全部已编译测试
cd /d "E:\eigen-3.4.1-src\tests" ctest -C Release --output-on-failure -j 2这里的-C Release不可省略:VS2019 是多配置生成器,CTest 需要知道测试程序位于 Release 目录下。构建测试和运行测试是两个独立动作;单独执行ctest不会自动补编未生成的测试程序。[4]
通过标准:CTest 最后报告100% tests passed、0 tests failed,且没有Not Run。如果有失败或未运行项,应查看其具体原因,不能只看部分PASS。
5.4 通过 Visual Studio 界面构建(可选)
打开E:\eigen-3.4.1-src\tests目录中生成的.sln文件,选择x64 / Release;在“解决方案资源管理器”中查找并生成buildtests目标。之后仍在上述 CMD 窗口运行ctest -C Release --output-on-failure -j 2。
若只想快速排查单个测试,可先用
ctest -N查看测试名称,再编译对应测试目标并使用ctest -C Release -R "名称正则" --output-on-failure。这属于定向调试,不等于完整测试。
6. 常见问题
| 问题 | 处理方法 |
|---|---|
cl未识别 | 使用x64 Native Tools Command Prompt for VS 2019;检查 MSVC v142 是否安装 |
找不到CMakeLists.txt或Eigen\Dense | 解压路径多了一层目录;定位真正的 Eigen 源码根目录 |
找不到Eigen3Config.cmake | 先完成第 3 节安装;检查CMAKE_PREFIX_PATH指向安装根目录,而非include\eigen3 |
Eigen/Dense: No such file or directory | 检查头文件是否已安装,包含目录应指向...\include\eigen3 |
| 生成器、x64/Win32 配置冲突 | 给不同生成器或平台使用独立build目录;不要复用旧缓存 |
ALL_BUILD没有编译测试 | 正常;使用--target buildtests明确构建测试套件 |
CTest 报Unable to find executable | 先执行第 5.2 节,检查编译是否成功,并确保 CTest 指定-C Release |
MSVCC1060/C1076 | 降低构建并行度,如--parallel 1;检查系统可用内存 |
| CTest 有个别测试失败 | 查看--output-on-failure输出;区分编译失败、断言失败、超时与缺少可选依赖,不能直接判定安装失败 |
找不到eigen.lib | 正常。Eigen 核心为头文件模板库,无需链接二进制库 |
7. 参考资料
[1] Eigen 官方主页:Requirements(头文件库及 CMake 用途)。
[2] Eigen 3.4 官方文档:Using Eigen in CMake Projects。
[3] Eigen 3.4.1 官方源码与发布页面。
[4] Eigen 官方开发文档:Tests(buildtests、check、CTest)。
[5] Eigen 3.4.1 源码:顶层 CMakeLists.txt。