网上关于交叉编译armadillo库比较少,借鉴了一些但是在前几天编译时总是磕磕绊绊,于是写一个详细的编译过程。
交叉编译armadillo库包含两个步骤:交叉编译依赖库和交叉编译armadillo。armadillo官网介绍依赖库如下图所示:
需要注意如果交叉编译armadillo库就不要在ubuntu中使用apt安装libopenblas-dev liblapack-dev libarpack2-dev libsuperlu-dev,这样会在编译armadillo时,自动找ubuntu路径下的依赖库,导致编译失败,当然修改CMakeLists.txt和CMakeCache.txt能够解决该问题。这里采用不安装依赖库的方式,这样在编译armadillo,会找不到对应的依赖库,使得armdillo库顺利编译通过。
1、依赖库交叉编译
a)下载库文件
路径如下:https://netlib.org/clapack/clapack-3.2.1-CMAKE.tgz
然后解压,进入clapack-3.2.1-CMAKE路径,打开终端
b)创建make.inc
输入:
cp make.inc.example make.inc
c)修改make.inc
把里面的CC和LOADDER修改为交叉编译器。
改成:
注意:
/home/fmsh/work/FMQL-Linux-SDK_20201022/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc为我ubuntu的交叉编译器路径,根据实际情况修改为对应交叉编译器。
d)修改clapack-3.2.1-CMAKE/F2CLIBS/libf2c/Makefile文件
ld -r -x -o $*.xxx $*.o修改为:
/home/fmsh/work/FMQL-Linux-SDK_20201022/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ld -r -x -o $*.xxx $*.o
e)生成f2clib
输入:make f2clib
第一次会报错,再输入一次就会在F2CLIBS路径下生成libf2c.a
f)生成BLAS库
输入:make blaslib
会在clapack-3.2.1-CMAKE目录下生成:blas_LINUX.a
g)生成LAPACK库
输入: cd SRC
输入:make
会在clapack-3.2.1-CMAKE目录下生成lapack_LINUX.a
如果报错,可以退回clapack-3.2.1-CMAKE然后make lapacklib,然后再回到SRC,再次make
h)复制库文件到特定路径
$cp libf2c.a [CROSS-COMPILE LIBRARY PATH]/libf2c.a
$cp blas_XXXXX.a [CROSS-COMPILE LIBRARY PATH]/libblas.a
$cp lapack_XXXXX.a [CROSS-COMPILE LIBRARY PATH]/liblapack.a
2.编译armadillo
a)下载armadillo
Armadillo: C++ library for linear algebra & scientific computing - Download
b)修改CMakeLists.txt
set(ARMA_USE_LAPACK false) 修改为
set(ARMA_USE_LAPACK true)
c)直接cmake
输入:
cmake .
注意有个点
d)修改CMakeCache.txt
//CXX compiler
CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++
修改为:
CMAKE_CXX_COMPILER:FILEPATH=/home/fmsh/work/FMQL-Linux-SDK_20201022/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
e)修改Cmakefile->armadillo.dir->link.txt
把G++修改为如下
/home/fmsh/work/FMQL-Linux-SDK_20201022/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -fPIC -O2 -Wl,--no-as-needed -shared -Wl,-soname,libarmadillo.so.12 -o libarmadillo.so.12.8.4 CMakeFiles/armadillo.dir/src/wrapper1.cpp.o CMakeFiles/armadillo.dir/src/wrapper2.cpp.o
f)修改test1路径下的CmakeLists.txt
将前面生成的依赖库,link进来
target_link_libraries(smoke_test PRIVATE /home/fmsh/work/FMQL-Linux-SDK_20201022/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/usrlib/liblapack.a)
target_link_libraries(smoke_test PRIVATE /home/fmsh/work/FMQL-Linux-SDK_20201022/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/usrlib/libblas.a)
target_link_libraries(smoke_test PRIVATE /home/fmsh/work/FMQL-Linux-SDK_20201022/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/usrlib/libf2c.a)
g)编译
输入:make
就可以在test1下生成smoke_test
h)拷贝库
从ubuntu中将libarmadillo.so.12.8.4拷贝出来,并重命名为libarmadillo.so.12,随后拷贝到到板卡系统中的usr/lib
i)运行
拷贝test1/smoke_test到板卡,运行结果如下: