news 2026/5/24 2:31:33

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows下用CMake和MinGW编译OSQP-Eigen避坑全记录(附Qt项目配置)

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

当你在Windows平台上使用Qt进行机器人控制或优化算法开发时,OSQP-Eigen库无疑是个强大的工具。但当你满怀期待地打开CMake准备编译时,迎接你的可能是一连串令人崩溃的错误提示。本文将带你完整走一遍这个充满陷阱的旅程,从源码准备到最终Qt项目集成,手把手解决那些官方文档没告诉你的坑。

1. 环境准备与源码获取

在开始之前,确保你的系统已经安装了以下工具:

  • MinGW-w64(建议使用8.1.0或更高版本)
  • CMake(3.15+)
  • Git(用于源码获取)

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 Files),CMake很可能找不到它。解决方法是在CMake命令中显式指定路径:

cmake -DEigen3_DIR="D:/Libs/eigen-3.4.0" -G "MinGW Makefiles" ..

2.2 FindEigen3.cmake文件缺失

当看到Could NOT find Eigen3 (missing: EIGEN3_INCLUDE_DIR)错误时,需要:

  1. 从Eigen源码的cmake/目录复制FindEigen3.cmake
  2. 粘贴到CMake的模块目录,如C:\Program Files\CMake\share\cmake-3.27\Modules

3. OSQP编译的特殊处理

OSQP的编译过程看似简单,但有几个关键点需要注意。

3.1 安装路径中的括号问题

永远不要使用包含空格或括号的默认安装路径(如Program Files (x86))。建议在CMake时指定自定义路径:

cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX="D:/Libs/osqp-0.6.3" ..

3.2 并行编译可能失败

使用-j参数加速编译可能导致奇怪错误。稳妥的做法是:

cmake --build . --target install --config Release

4. OSQP-Eigen的编译陷阱

这是问题最多的环节,需要格外小心。

4.1 头文件引用方式修正

编译成功后集成到Qt项目时,你会遇到osqp.h: No such file or directory错误。这是因为OSQP-Eigen的头文件引用方式与Windows下的实际路径不符。需要手动修改以下文件:

  1. osqp-eigen/include/OsqpEigen/Compat.hpp

    // 修改前 #include <osqp.h> // 修改后 #include <osqp/osqp.h>
  2. osqp-eigen/include/OsqpEigen/Solver.tpp

    // 修改前 #include <auxil.h> #include <scaling.h> // 修改后 #include <osqp/auxil.h> #include <osqp/scaling.h>

4.2 MinGW特定编译选项

在Windows下使用MinGW时,需要添加以下CMake选项:

cmake -G "MinGW Makefiles" \ -DCMAKE_SH="CMAKE_SH-NOTFOUND" \ -DCMAKE_BUILD_TYPE=Release \ ..

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 += -L"D:/Libs/osqp-0.6.3/lib" -losqp LIBS += -L"D:/Libs/osqp-eigen-0.8.1/lib" -lOsqpEigen

5.2 常见链接错误解决

如果遇到undefined reference错误,检查:

  1. 库路径是否正确
  2. 库文件名是否匹配(MinGW生成的库可能带有.dll.a后缀)
  3. 构建模式是否一致(Debug/Release)

6. 验证安装的测试代码

在Qt项目中创建一个简单的测试用例:

#include <QDebug> #include <OsqpEigen/OsqpEigen.h> void testOsqpEigen() { Eigen::SparseMatrix<double> P(2, 2); Eigen::VectorXd q(2), l(1), u(1); Eigen::SparseMatrix<double> 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. 性能优化建议

在机器人控制等实时应用中,还需要考虑:

  1. 热启动:利用上一次的解作为初始猜测

    solver.settings()->setWarmStart(true);
  2. 参数调优

    solver.settings()->setMaxIteration(4000); solver.settings()->setAbsoluteTolerance(1e-6);
  3. 矩阵预分配:对于固定维度问题,预先分配好稀疏矩阵内存

    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>)

经过这些步骤,你应该能在Windows+Qt+MinGW环境下顺利使用OSQP-Eigen了。记住,每次环境变更(如升级编译器版本)都可能需要重新编译所有依赖库,建议保留好编译成功的库版本备份。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 2:31:21

2026届必备的六大AI科研工具实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 让人工智能来撰写开题报告&#xff0c;效率能得到显著提升&#xff0c;首先&#xff0c;把研…

作者头像 李华
网站建设 2026/5/23 1:35:27

Transformers实战:从零到一微调Qwen与DeepSeek的完整指南

1. 环境准备与基础配置 第一次接触大模型微调时&#xff0c;最让人头疼的就是环境配置。记得去年我在本地机器上折腾了整整两天才把CUDA和PyTorch版本对齐&#xff0c;后来发现其实用conda管理环境能省去80%的麻烦。下面分享几个真正实用的环境搭建技巧&#xff1a; 必备组件清…

作者头像 李华
网站建设 2026/5/23 1:35:24

扩散模型+3D感知:拆解TeethDreamer如何用5张图‘脑补’出完整牙齿

TeethDreamer技术解析&#xff1a;如何用扩散模型实现牙齿三维重建的突破 想象一下&#xff0c;牙医仅凭你手机拍摄的五张口腔照片&#xff0c;就能在屏幕上生成一副完整的3D牙齿模型——这听起来像科幻场景的技术&#xff0c;如今已被TeethDreamer框架变为现实。这项发表于MIC…

作者头像 李华
网站建设 2026/5/23 1:35:27

d2s-editor:暗黑破坏神2存档编辑器的3大核心优势与5步上手指南

d2s-editor&#xff1a;暗黑破坏神2存档编辑器的3大核心优势与5步上手指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2的存档修改而烦恼吗&#xff1f;你是否曾因为一个错误的十六进制编辑导致存档损坏&am…

作者头像 李华
网站建设 2026/5/23 1:35:24

ARM开发板调试不求人:用objdump反汇编LED程序,手把手教你读懂机器码

ARM开发板调试实战&#xff1a;用objdump反汇编LED程序的三层透视法 刚拿到ARM开发板的新手常会遇到这样的困境&#xff1a;烧录进去的LED闪烁程序毫无反应&#xff0c;串口调试信息空空如也&#xff0c;硬件仿真器又不在手边。这时候&#xff0c;学会用objdump反汇编可执行文件…

作者头像 李华
网站建设 2026/5/23 1:35:36

避坑指南:VBA列表框ColumnHeads不显示?可能是这个属性没设置对

VBA列表框列标题显示问题深度解析与实战解决方案 在Excel VBA开发中&#xff0c;列表框(ListBox)和组合框(ComboBox)是用户窗体中最常用的控件之一&#xff0c;它们能够有效地组织和展示数据。然而&#xff0c;许多中级VBA开发者在实现列标题显示功能时&#xff0c;常常会遇到C…

作者头像 李华