Ubuntu中交叉编译armadillo库

发布于:2024-10-12 ⋅ 阅读:(7) ⋅ 点赞:(0)

        网上关于交叉编译armadillo库比较少,借鉴了一些但是在前几天编译时总是磕磕绊绊,于是写一个详细的编译过程。

        交叉编译armadillo库包含两个步骤:交叉编译依赖库和交叉编译armadillo。armadillo官网介绍依赖库如下图所示:

a7bb2bacf6f64f9f80db9f08849b82ba.png

        需要注意如果交叉编译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修改为交叉编译器。

6c0fc217244743d7aaee44736f00580e.png

改成:

100c30fe402f41acba2b20c4804b2e15.png

注意:

/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文件

5579d2a77a0e4037a99077b4340865df.png

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

3142990b0a034163a718efd10b6a79c7.png

e)生成f2clib

输入:make f2clib

第一次会报错,再输入一次就会在F2CLIBS路径下生成libf2c.a

7e215572846b4077aa53f36fe64a56f6.png

f)生成BLAS库

输入:make blaslib

会在clapack-3.2.1-CMAKE目录下生成:blas_LINUX.a

b25702a6de11415f987fa851953d9f4f.png

g)生成LAPACK库

输入: cd SRC

输入:make

会在clapack-3.2.1-CMAKE目录下生成lapack_LINUX.a

如果报错,可以退回clapack-3.2.1-CMAKE然后make lapacklib,然后再回到SRC,再次make

df22c3169d844842a543a01f87ea9897.png

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)

405a35d3652a42b09929034e11efce92.png

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++

85174baf337d459f9b9b077ba43042d2.png

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

85471c4043b34860be1a6ebe4893f02c.png

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)

f84a076ed8434103ba0d6891da6f655a.png

g)编译

输入:make

就可以在test1下生成smoke_test

eeb0e873b2db4ff39749e6cd989cca25.png

h)拷贝库

从ubuntu中将libarmadillo.so.12.8.4拷贝出来,并重命名为libarmadillo.so.12,随后拷贝到到板卡系统中的usr/lib

i)运行

拷贝test1/smoke_test到板卡,运行结果如下:

6589cda222af419d96c86a9073235480.png