Windows下用CMake和MinGW编译OSQP-Eigen避坑全记录(附Qt项目配置)

张开发
2026/4/13 22:53:30 15 分钟阅读

分享文章

Windows下用CMake和MinGW编译OSQP-Eigen避坑全记录(附Qt项目配置)
Windows下用CMake和MinGW编译OSQP-Eigen避坑全记录附Qt项目配置当你在Windows平台上使用Qt进行机器人控制或优化算法开发时OSQP-Eigen库无疑是个强大的工具。但当你满怀期待地打开CMake准备编译时迎接你的可能是一连串令人崩溃的错误提示。本文将带你完整走一遍这个充满陷阱的旅程从源码准备到最终Qt项目集成手把手解决那些官方文档没告诉你的坑。1. 环境准备与源码获取在开始之前确保你的系统已经安装了以下工具MinGW-w64建议使用8.1.0或更高版本CMake3.15Git用于源码获取1.1 依赖库版本匹配这是第一个大坑——版本兼容性。根据实测以下组合可以确保顺利编译库名称推荐版本关键说明Eigen3.4.0必须使用源码编译OSQP0.6.3最新版可能与OSQP-Eigen不兼容OSQP-Eigen0.8.1需要手动修改头文件引用方式获取源码时建议使用以下命令指定版本# OSQP (必须指定0.6.3版本) git clone --recursive -b release-0.6.3 https://github.com/oxfordcontrol/osqp.git # OSQP-Eigen git clone https://github.com/robotology/osqp-eigen.git注意直接下载master分支可能导致版本不匹配这是后续编译失败的常见原因。2. Eigen3的安装与配置虽然Eigen是纯头文件库但在Windows下的配置也有讲究。2.1 非标准安装路径问题如果你没有将Eigen安装在标准路径如C:\Program FilesCMake很可能找不到它。解决方法是在CMake命令中显式指定路径cmake -DEigen3_DIRD:/Libs/eigen-3.4.0 -G MinGW Makefiles ..2.2 FindEigen3.cmake文件缺失当看到Could NOT find Eigen3 (missing: EIGEN3_INCLUDE_DIR)错误时需要从Eigen源码的cmake/目录复制FindEigen3.cmake粘贴到CMake的模块目录如C:\Program Files\CMake\share\cmake-3.27\Modules3. OSQP编译的特殊处理OSQP的编译过程看似简单但有几个关键点需要注意。3.1 安装路径中的括号问题永远不要使用包含空格或括号的默认安装路径如Program Files (x86)。建议在CMake时指定自定义路径cmake -G MinGW Makefiles -DCMAKE_INSTALL_PREFIXD:/Libs/osqp-0.6.3 ..3.2 并行编译可能失败使用-j参数加速编译可能导致奇怪错误。稳妥的做法是cmake --build . --target install --config Release4. OSQP-Eigen的编译陷阱这是问题最多的环节需要格外小心。4.1 头文件引用方式修正编译成功后集成到Qt项目时你会遇到osqp.h: No such file or directory错误。这是因为OSQP-Eigen的头文件引用方式与Windows下的实际路径不符。需要手动修改以下文件osqp-eigen/include/OsqpEigen/Compat.hpp// 修改前 #include osqp.h // 修改后 #include osqp/osqp.hosqp-eigen/include/OsqpEigen/Solver.tpp// 修改前 #include auxil.h #include scaling.h // 修改后 #include osqp/auxil.h #include osqp/scaling.h4.2 MinGW特定编译选项在Windows下使用MinGW时需要添加以下CMake选项cmake -G MinGW Makefiles \ -DCMAKE_SHCMAKE_SH-NOTFOUND \ -DCMAKE_BUILD_TYPERelease \ ..5. Qt项目集成实战完成库的编译后如何在Qt项目中正确使用5.1 .pro文件配置示例# 添加包含路径 INCLUDEPATH D:/Libs/eigen-3.4.0 INCLUDEPATH D:/Libs/osqp-0.6.3/include INCLUDEPATH D:/Libs/osqp-eigen-0.8.1/include # 添加库路径 LIBS -LD:/Libs/osqp-0.6.3/lib -losqp LIBS -LD:/Libs/osqp-eigen-0.8.1/lib -lOsqpEigen5.2 常见链接错误解决如果遇到undefined reference错误检查库路径是否正确库文件名是否匹配MinGW生成的库可能带有.dll.a后缀构建模式是否一致Debug/Release6. 验证安装的测试代码在Qt项目中创建一个简单的测试用例#include QDebug #include OsqpEigen/OsqpEigen.h void testOsqpEigen() { Eigen::SparseMatrixdouble P(2, 2); Eigen::VectorXd q(2), l(1), u(1); Eigen::SparseMatrixdouble A(1, 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; l 1; u 1; OsqpEigen::Solver solver; solver.settings()-setVerbosity(false); solver.data()-setNumberOfVariables(2); solver.data()-setNumberOfConstraints(1); solver.data()-setHessianMatrix(P); solver.data()-setGradient(q); solver.data()-setLinearConstraintsMatrix(A); solver.data()-setLowerBound(l); solver.data()-setUpperBound(u); if(!solver.initSolver()){ qDebug() 初始化失败; return; } if(!solver.solve()){ qDebug() 求解失败; return; } Eigen::VectorXd solution solver.getSolution(); qDebug() 解为: solution(0) solution(1); }7. 性能优化建议在机器人控制等实时应用中还需要考虑热启动利用上一次的解作为初始猜测solver.settings()-setWarmStart(true);参数调优solver.settings()-setMaxIteration(4000); solver.settings()-setAbsoluteTolerance(1e-6);矩阵预分配对于固定维度问题预先分配好稀疏矩阵内存P.reserve(Eigen::VectorXi::Constant(2, 3));8. 跨平台兼容性处理如果你的代码需要在Linux和Windows下运行可以使用预处理指令处理路径差异#ifdef _WIN32 #include osqp/osqp.h #else #include osqp.h #endif或者在CMake中统一处理target_compile_definitions(your_target PRIVATE $$PLATFORM_ID:Windows:OSQP_USE_WINDOWS_PATH_STYLE)经过这些步骤你应该能在WindowsQtMinGW环境下顺利使用OSQP-Eigen了。记住每次环境变更如升级编译器版本都可能需要重新编译所有依赖库建议保留好编译成功的库版本备份。

更多文章