如何将acados生成代码集成到C++项目并通过CMake构建?
如何将acados生成的C代码集成到C++控制器项目中?
目标
我想用acados开发一个控制单摆的C++控制器,以此学习acados在实际控制器开发中的应用。
已完成操作
- 通过acados Python接口编写OCP求解代码,用CMakeBuilder生成了包含自动生成的
CMakeLists.txt的c_generated_code文件夹 - 进入
c_generated_code目录执行make,成功生成并运行main_pendulum和main_sim_pendulum可执行文件,确认代码生成无问题 - 启用生成的
CMakeLists.txt相关选项,配置ACADOS_SOURCE_DIR和LD_LIBRARY_PATH环境变量后,生成的可执行文件能正常运行,但编译过程不需要依赖这些环境变量 - 在自定义C++文件中引入
c_generated_code/acados_solver_pendulum.h,修改c_generated_code下的CMakeLists.txt添加导出配置,根目录CMakeLists.txt添加子目录及链接库配置,但编译时出现错误:fatal error: 'acados/utils/types.h' file not found
核心问题
- 集成acados生成代码时,C++文件需要包含哪些头文件?
- 如何正确配置CMake来构建整个项目?
补充信息
- Python生成的CMake编译输出显示所有目标构建成功
- 项目目录结构已明确
解决方案
1. 头文件包含
- 必须包含acados生成的求解器头文件:
#include "acados_solver_pendulum.h" - 生成代码依赖的acados核心头文件(如
acados/utils/types.h)无需手动在代码中直接包含,只要CMake配置正确,编译器会自动识别并引入这些依赖路径。
2. CMake配置步骤
方式一:复用生成代码的CMake配置
c_generated_code下自动生成的CMakeLists.txt已包含完整的依赖配置,直接在根目录CMakeLists.txt中引入子目录并链接库即可:
cmake_minimum_required(VERSION 3.10) project(pendulum_controller) # 添加acados生成代码的子目录 add_subdirectory(c_generated_code) # 定义你的C++控制器目标 add_executable(your_controller your_controller.cpp) # 链接acados生成的求解器库 target_link_libraries(your_controller PRIVATE acados_solver_pendulum) # 指定acados安装路径(如果不是全局安装) if(NOT DEFINED ACADOS_SOURCE_DIR) set(ACADOS_SOURCE_DIR "/path/to/your/acados") endif() include_directories(${ACADOS_SOURCE_DIR}/include) link_directories(${ACADOS_SOURCE_DIR}/lib)
方式二:修复头文件路径错误
编译报错'acados/utils/types.h' file not found是因为CMake未将acados核心头文件目录加入包含路径。在根目录或c_generated_code的CMakeLists.txt中添加:
# 引入acados核心头文件目录 include_directories(${ACADOS_SOURCE_DIR}/include)
配置CMake时通过命令行传递acados路径:
cmake .. -DACADOS_SOURCE_DIR=/path/to/your/acados
注意事项
- 无需修改
c_generated_code中的CMakeLists.txt添加导出配置,原配置已满足需求 - 若acados通过conda安装,
ACADOS_SOURCE_DIR通常为${CONDA_PREFIX}/lib/pythonX.X/site-packages/acados(替换X.X为你的Python版本) - 编译阶段不需要
LD_LIBRARY_PATH,但运行时需确保acados库文件可被找到,可通过target_link_libraries直接链接,或运行前设置环境变量
内容的提问来源于stack exchange,提问作者MIKE PAPADAKIS
相关产品推荐
相关产品推荐

