当前位置: 首页 > news >正文

【MPC-C++】qpOASES 源码编译与链接,编译器设置细节

qpOASES 源码编译与链接

克隆源码

git clone https://github.com/coin-or/qpOASES.gitcd qpOASES
mkdir build
cd build

接下来是构建,有一些细节。

查看 CMakeLists.txt,发现如果不显示指定 CMAKE_BUILD_TYPE 构建版本,会自动编译 Release 版本。并使用 CMAKE_CXX_FLAGS_RELEASE 指定了 O3 的最高优化等级。这样效率更优。

IF( NOT CMAKE_BUILD_TYPE )SET(CMAKE_BUILD_TYPE Release CACHE STRING"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."FORCE)
ENDIF( NOT CMAKE_BUILD_TYPE )IF ( UNIX )SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Wfloat-equal -Wshadow -DLINUX")SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_DEBUG} -O3 -finline-functions")
ELSEIF( WINDOWS )SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nologo -EHsc -DWIN32")
ENDIF()

因此以下两个命令等效

cmake ..
cmake .. -DCMAKE_BUILD_TYPE=Release

然后编译

make -j$(nproc)

之后就可以在自己的项目中链接库和头文件。把 build/libsinclude 两个文件夹复制到项目中。

在项目的 CMakeLists.txt 用相对路径进行链接。

target_link_libraries(target${CMAKE_CURRENT_SOURCE_DIR}/xxx/libs/libqpOASES.a
)target_include_directories(simple_planner PUBLIC${CMAKE_CURRENT_SOURCE_DIR}/xxx/include
)

同样建议指定项目的构建版本和优化等级。不同编译器设置求解性能可能相差10倍以上。

# 设置为 Release 构建类型
set(CMAKE_BUILD_TYPE Release)# 设置 C 和 C++ 的 Release 编译标志
set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")

一些对实时性要求高的场合比如 MPC,可以进一步考虑开启架构适配。让编译器自动检测你当前编译机器的 CPU 架构,并为该 CPU 生成最优的本地代码。但是这样可能带来额外的适配性问题,网上有较多的讨论,也不能过于依赖编译器。需要综合数学问题转换、数值求解原理(如根据问题特点选择 qpOASES/OSQP/HPIPM)、求解器配置、代码实现和编译器配置来调优。

set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG -march=native")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -march=native")
http://www.xdnf.cn/news/957997.html

相关文章:

  • bond配置与拆卸
  • 理解OpenFOAM案例中的blockMesh文件里的simpleGrading
  • 【AI论文】CASS:Nvidia到AMD的数据、模型和基准测试的转换
  • 应对无法定位程序输入点kernel32.dll错误的详尽指南:从问题分析到解决方案
  • 如何迁移Cordova应用到HarmonyOS 5 以及迁移时常见的问题?
  • RK3288项目(四)--linux内核之V4L2框架及ov9281驱动分析(中)
  • 深入理解Optional:处理空指针异常
  • upload-labs文件上传_文件上传漏洞_靶场
  • 【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
  • 易学探索助手-个人记录(十四)
  • 【使用LLM搭建系统】5 处理输入: 链式 Prompt Chaining Prompts
  • 运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.
  • React hook之useRef
  • STM32---外部32.768K晶振(LSE)无法起振问题
  • 模型重展UV后绘制纹理
  • 什么是人工智能(AI)?大学想学AI,该如何入手?
  • 【CATIA的二次开发24】抽象对象Document涉及文档生命周期的方法
  • Python文本序列的类型
  • IDC 观察:一体化数据库如何支撑 GenAI 的数据需求
  • WebGL与Three.js:从基础到应用的关系与原理解析
  • MybatisPlus枚举类的应用与转换
  • L1和L2核心区别 !!--part 2
  • 基于人工智能的闸机人脸识别门禁系统
  • 昇腾CANN集合通信技术解读——细粒度分级流水算法
  • CMake 从 GitHub 下载第三方库并使用
  • 高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
  • ABAP设计模式之---“童子军法则(The Boy Scout Rule)”
  • animate.css详解:轻松实现网页动画效果
  • 制作一款打飞机游戏68:地面敌人
  • CopyOnWriteArrayList和CopyOnWriteArraySet :并发安全的写时复制机制