克隆源码
git clone https://github.com/coin-or/qpOASES.git
cd qpOASES
mkdir build
cd build
接下来是构建,有一些细节。
查看 cmakelist,发现如果不显示指定 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/libs 和 include 两个文件夹复制到项目中。
在项目的 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")
克隆源码
git clone https://github.com/coin-or/qpOASES.git
cd qpOASES
mkdir build
cd build
接下来是构建,有一些细节。
查看 cmakelist,发现如果不显示指定 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/libs 和 include 两个文件夹复制到项目中。
在项目的 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")