Windows下Eigen、OSQP与OSQP-Eigen库的完整安装与Qt集成实战

张开发
2026/4/14 0:08:23 15 分钟阅读

分享文章

Windows下Eigen、OSQP与OSQP-Eigen库的完整安装与Qt集成实战
1. 环境准备与工具安装在Windows平台上进行Eigen、OSQP和OSQP-Eigen的安装首先需要准备好必要的工具链。我推荐使用以下组合CMake作为构建工具MinGW作为编译器。实测下来这个组合在Windows 10/11上最稳定兼容性也最好。CMake的安装非常简单直接从官网下载最新版本即可。我当前使用的是3.26.3版本安装时记得勾选Add CMake to system PATH选项这样后续在命令行中可以直接使用。安装完成后可以在命令行输入cmake --version验证是否成功。对于编译器我强烈推荐使用TDM-GCC的64位版本。这个发行版对Windows的支持非常好而且包含了完整的MinGW工具链。安装时选择MinGW-w64/TDM64架构确保勾选Add to PATH选项。安装完成后通过gcc --version和g --version检查是否可用。注意编译器版本与后续库的兼容性非常重要。我遇到过因为GCC版本过高导致OSQP编译失败的情况建议使用GCC 10.3.0这个相对稳定的版本。2. Eigen库的安装与配置Eigen是一个C模板库主要用于线性代数运算。它的安装相对简单因为它是纯头文件库不需要编译。首先从官网或GitHub下载最新稳定版源码包我使用的是3.4.0版本。解压后建议将文件夹重命名为简单的路径比如D:\Libs\eigen-3.4.0。虽然Eigen不需要编译但需要设置两个关键配置添加环境变量EIGEN3_INCLUDE_DIR值为Eigen的根目录路径将FindEigen3.cmake文件从Eigen的cmake目录复制到CMake的模块目录这里有个容易踩坑的地方不同版本的CMake模块路径可能不同。在我的机器上路径是C:\Program Files\CMake\share\cmake-3.26\Modules。复制这个文件可以避免后续其他库找不到Eigen的问题。验证Eigen是否安装成功很简单创建一个测试程序#include iostream #include Eigen/Dense int main() { Eigen::Matrix2d mat; mat 1, 2, 3, 4; std::cout Matrix:\n mat std::endl; return 0; }编译运行能正确输出矩阵就说明安装成功了。3. OSQP库的编译与安装OSQP是一个二次规划求解器它的安装过程相对复杂一些。我建议按照以下步骤操作3.1 获取源码从GitHub仓库获取0.6.3版本的源码这个版本与最新的OSQP-Eigen兼容性最好。可以使用以下命令git clone --recursive -b release-0.6.3 https://github.com/oxfordcontrol/osqp.git重要提醒一定要指定0.6.3版本否则默认会拉取最新代码可能导致与OSQP-Eigen不兼容。3.2 编译配置在源码目录下创建build文件夹然后运行CMake配置mkdir build cd build cmake -G MinGW Makefiles -DCMAKE_INSTALL_PREFIX:PATHD:\Libs\osqp ..这里有几个关键点必须指定-G MinGW Makefiles来使用MinGW编译器建议设置自定义安装路径避免默认路径中的空格和括号导致问题如果遇到BLAS/LAPACK相关错误可以添加-DENABLE_LAPACKOFF选项3.3 编译与安装配置成功后执行编译和安装cmake --build . --config Release cmake --install .编译过程可能需要几分钟时间。安装完成后记得将安装目录下的bin文件夹如D:\Libs\osqp\bin添加到系统PATH环境变量中。4. OSQP-Eigen的安装与问题解决OSQP-Eigen是连接OSQP和Eigen的桥梁库安装过程与OSQP类似4.1 获取源码从GitHub克隆最新代码git clone https://github.com/robotology/osqp-eigen.git4.2 编译配置在源码目录下创建build文件夹并配置mkdir build cd build cmake -G MinGW Makefiles -DCMAKE_INSTALL_PREFIX:PATHD:\Libs\osqp-eigen ..这里需要特别注意Eigen3和OSQP的路径是否正确被找到。如果CMake报找不到这些依赖可以手动指定路径cmake -DEigen3_DIRD:\Libs\eigen-3.4.0 -DOSQP_DIRD:\Libs\osqp ..4.3 常见问题解决在实际安装中我遇到了几个典型问题头文件找不到错误需要修改OSQP-Eigen源码中的include语句将#include osqp.h改为#include osqp/osqp.h链接错误确保环境变量PATH中包含OSQP的bin目录并且Qt项目正确链接了osqp.lib和osqp-eigen.lib版本不匹配这是最常见的问题务必确保OSQP 0.6.3和OSQP-Eigen 0.8.1的版本组合5. Qt项目集成实战在Qt Creator中集成这三个库需要进行以下配置5.1 .pro文件配置在Qt项目的.pro文件中添加以下内容# Eigen配置 INCLUDEPATH D:/Libs/eigen-3.4.0 # OSQP配置 win32 { INCLUDEPATH D:/Libs/osqp/include LIBS -LD:/Libs/osqp/lib -losqp } # OSQP-Eigen配置 win32 { INCLUDEPATH D:/Libs/osqp-eigen/include LIBS -LD:/Libs/osqp-eigen/lib -losqp-eigen }5.2 测试示例下面是一个简单的二次规划问题示例验证安装是否成功#include QCoreApplication #include OsqpEigen/OsqpEigen.h #include iostream int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 构建QP问题 Eigen::SparseMatrixdouble P(2,2); Eigen::VectorXd q(2), l(3), u(3); Eigen::SparseMatrixdouble A(3,2); // 填充数据 P.insert(0,0) 4; P.insert(0,1) 1; P.insert(1,0) 1; P.insert(1,1) 2; q 1, 1; A.insert(0,0) 1; A.insert(0,1) 1; A.insert(1,0) 1; A.insert(1,1) 0; A.insert(2,0) 0; A.insert(2,1) 1; l 1, 0, 0; u 1, 0.7, 0.7; // 创建求解器 OsqpEigen::Solver solver; solver.settings()-setVerbosity(true); // 设置问题数据 solver.data()-setNumberOfVariables(2); solver.data()-setNumberOfConstraints(3); solver.data()-setHessianMatrix(P); solver.data()-setGradient(q); solver.data()-setLinearConstraintsMatrix(A); solver.data()-setLowerBound(l); solver.data()-setUpperBound(u); // 初始化并求解 if(solver.initSolver()) { solver.solve(); Eigen::VectorXd solution solver.getSolution(); std::cout Solution: solution.transpose() std::endl; } return a.exec(); }如果一切配置正确这个程序应该能输出最优解。我在实际项目中多次使用这个组合稳定性相当不错对于中小规模的优化问题求解效率很高。6. 性能优化与调试技巧经过多次项目实践我总结了一些优化技巧矩阵构建优化Eigen的稀疏矩阵构建很耗时建议先使用reserve()预分配空间求解器参数调优OSQP的setRho和setSigma参数对收敛速度影响很大需要根据问题调整多线程安全OSQP-Eigen不是线程安全的在多线程环境中使用时需要加锁内存管理频繁创建销毁求解器实例会导致内存碎片建议复用求解器对象调试时如果遇到奇怪的问题可以尝试以下步骤检查所有库是否都是Release版本编译确认运行时PATH环境变量包含所有必要的DLL路径使用Dependency Walker工具检查库依赖关系在Qt Creator的项目设置中开启详细编译输出我在一个机器人路径规划项目中通过合理设置OSQP参数将求解时间从120ms降低到了35ms效果非常显著。关键是要理解每个参数的实际意义而不是盲目调整。

更多文章