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