ARM64交叉编译OSQP库
准备工作
-
下载OSQP 0.4.1:https://github.com/osqp/osqp/releases/tag/v0.4.1,因为需求而选择这个版本,但是不知为何其中的
osqp\lin_sys\direct\qdldl\qdldl_sources
是缺失的,还要下载最新版的OSQP,获取里面的QDLDL源代码复制进去。 -
下载安装cmake 3.18.4:https://github.com/Kitware/CMake/releases/tag/v3.18.4,按照自己主机的情况下载,我的是cmake-3.18.4-win64-x64.msi。
-
下载交叉编译工具链:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads,根据主机的系统和编译目标,来选择工具链。如果是编译裸机板子,那么选择aarch64-none-elf;如果是编译linux应用程序,选择aarch64-none-linux-gnu。
交叉编译
1.打开cmake图形界面
cmake有图形界面,WIN系统可以从开始界面找到。
2.配置编译
- 在 Where is the source code: 栏,寻找到OSQP的根目录。
- 在OSQP根目录下,新建一个build文件夹。
- 在 Where to build the binaries: 栏,寻找到build文件夹的路径。
- 点击configure,弹出如下窗口:
- 如果是主机是WIN系统,选择MinGW Makefiles;如果是Linux系统,选择Unix Makefiles。
- 下面四个选项选择Specify options for cross-compiling
- 点击Next,弹出窗口:
-
填写Operating system 目标系统,如果目标没有系统,填写generic。
-
Compilers C/C++ 填ARM交叉编译工具链的gcc和g++路径。
-
Target Root填工具链的根目录,其他都选Search only in Target Root。
-
点击Finish。
-
出现错误(缺少make的路径),点击Add Entry,Name填CMAKE_MAKE_PROGRAM,Type选FILEPATH,Value填make.exe(WINDOWS)的路径,点击OK。
-
这时会出现两个相同的CMAKE_MAKE_PROGRAM项目,有一个是空的,要再设置一次路径,不知道为什么。
-
勾选Advanced。
-
再次点击Configure,出现如下错误:
- 需要将所有的值为CMAKE_XXX-NOTFOUND的关于编译链的条目能填的都填上,比如CMAKE_C_COMPILER_[…] 和CMAKE_CXX_COMPILER_[…] 之类的。
- 添加项目CMAKE_TRY_COMPILE_TARGET_TYPE,类型为STRING,值为STATIC_LIBRARY。
- 点击Configure,如果输出Configuring done则成功。
- 点击Generating,如果输出Generating done则成功。
因为我是跑在板子上,所以有些东西不需要,去掉了一些勾选,如上图一样。
如需改动,可以把build文件夹清空,再重新Configure和Generating
接下来是对OSQP中的一些改动:
- 在
osqp\lin_sys\lib_handler.h
,注释10-11行的两个linux头文件。 - 在
osqp\CMakeLists.txt
,注释21-30行的操作系统相关,注释358-359行的osqp_demo相关。 - 在
osqp\lin_sys\CMakeLists.txt
,注释16-21行linsys_lib_handler相关。 - 在
osqp\lin_sys\direct\qdldl\qdldl_sources\CMakeLists.txt
,注释129-148行的qdldl shared library相关。参考 - 在build文件夹中打开终端,输入cmake --build . 进行编译。
在osqp\build\out
中生成了libosqp.a
静态库。