Mat*_*att 6 cross-compiling blas lapack codesourcery armadillo
我喜欢使用犰狳线性代数库.将八度.m文件移植到C++时变得非常好,特别是当你必须使用本征方法时.
但是当我不得不从我的原生香草G ++中取出我的程序并将其转储到我的ARM处理器上时,我遇到了问题.因为我花了几个小时糊涂我的方式虽然我想分享,所以其他人可能会避免一些挫折.
如果其他人可以添加任何其他我会喜欢它.这是我用来解决这个问题的过程,肯定不是唯一或最好的方法.
Mat*_*att 12
首先我使用Code Sourcery作为我的交叉编译器.我知道那里有其他人,但我还没有为另一个编译器重建,不管这应该适用于任何编译器.
Armadillo库需要LAPACK和BLAS,但Code Sourcery没有Fortran编译器.这让我得到了一个f2c'ed版本的LAPACK和BLAS.
首先去抢夺消息来源.
一旦我们获得了源代码,接下来要做的就是为我们的最终硬件交叉编译它们.就我而言,使用CodeSourcery的ARM7.它是一个真正好主意,在这里阅读README文件,你真的可以只花时间和阅读他们做这一切.
首先要做的是更改make.inc文件以查看我们的交叉编译器而不是普通的GCC.通常你会导出$,但我发现修改makefile更容易跟踪.
编辑clapack-3.2.1-CMAKE/make.inc来自:
CC = GCC
LOADER = GCC
Run Code Online (Sandbox Code Playgroud)
至:
CC = [CROSS-COMPILER-GCC location]
LOADER = [CROSS-COMPILER-GCC location]
Run Code Online (Sandbox Code Playgroud)
编辑clapack-3.2.1-CMAKE/F2CLIBS/libf2c/Makefile来自:
ld -r -x -o $*.xxx $*.o
Run Code Online (Sandbox Code Playgroud)
至:
[CROSS-COMPILER-LD location] -r -x -o $*.xxx $*.o
Run Code Online (Sandbox Code Playgroud)编译f2c库:
$make f2clib
Run Code Online (Sandbox Code Playgroud)
当我创建f2c库时,我在最后得到一个错误:
./a.out > arith.h
/bin/sh: ./a.out: cannot execute binary file
make[1]: *** [arith.h] Error 126
make[1]: Leaving directory `/home/matt/clapack-3.2.1-CMAKE/F2CLIBS/libf2c'
make: *** [f2clib] Error 2
Run Code Online (Sandbox Code Playgroud)
这里没有实际问题.当然它会执行有问题,它是交叉编译的!
编译BLAS:
$make blaslib
Run Code Online (Sandbox Code Playgroud)
完成后,您会注意到您有一个新的"blas_XXXXX.a".这是您的交叉编译BLAS库.
编译LAPACK:
make.inc将指向您使用$make lapacklib,但这将导致它尝试更多执行交叉编译的项目.而是$cd进入SRC目录并:
$make
Run Code Online (Sandbox Code Playgroud)
这应该生成你的新"lapack_XXXXX.a".现在我们有了F2C,LAPACK和BLAS,我建议将它们放在有意义的地方,这样你以后就可以找到它们.在我的情况下,我将它们放在我保留Code Sourcery编译器/ CodeSourcery/arm-none-linux-gnueabi/usr/lib的地方.请记住重命名这些文件:
$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
Run Code Online (Sandbox Code Playgroud)
请记住,他们必须稍后才能识别"lib".再次继续将这些存储在交叉编译的库位置中.我用它的工具链进行设置,以便更容易与普通的gcc/g ++分开.
首先阅读README,始终是最好的起点.
继续运行:
$cmake .
Run Code Online (Sandbox Code Playgroud)
这将使一切准备就绪并生成cmake创建共享armadillo库所需的一切.我在这里进行的方式并不是我认为你应该如何,但由于我不是一般的makefile文件,因此我认为展示我所做的是为了让它进行交叉编译会很有帮助.我使用以下内容修改了生成的CMakeCache.txt行:
//CXX compiler.
CMAKE_CXX_COMPILER:FILEPATH=[CROSS-COMPILER-G++ location]
Run Code Online (Sandbox Code Playgroud)
我知道CMakeCache.txt文件中有一个地方你可以指定BLAS和LAPACK位置的路径,但我很难弄明白.我没有对这个问题猛烈抨击,而是修改了"CMakeFiles/armadillo.dir/link.txt"并手动添加了"-L [交叉编译的BLAS/LAPACK目录].更熟悉如何执行此操作的人可以指定注释?接下来因为我们想要在以后编译程序时手动链接BLAS和LAPACK库(如README所说)修改"include/armadillo_bits/config.hpp"并确保定义arma包装器使用的行是评论说:
// #define ARMA_USE_WRAPPER
Run Code Online (Sandbox Code Playgroud)
剩下要做的唯一事情就是$cd回到armadillo目录的根目录
$make
Run Code Online (Sandbox Code Playgroud)
制作完成后,您应该可以在程序中使用Armadillo.
要在程序中使用Armadillo,请添加include #include <armadillo>和命名空间using namespace arma;.现在你应该能够使用所有这些vec并且mat你感觉像.通常在使用arma时,你需要在编译时完成链接libarmadillo.so库,但正如我之前所说,我们需要直接链接BLAS和LAPACK.所以这是我的GCC C++编译器synatx:
[CROSS-COMPILER-G++] -I [CROSS-COMPILED ARMADILLO DIRECTORY]/include ...
Run Code Online (Sandbox Code Playgroud)
和我的链接器:
[CROSS-COMPILER-G++] -L [CROSS-COMPILED LIBRARY] -o ... -llapack -lf2c -lblas
Run Code Online (Sandbox Code Playgroud)
另请注意,链接库的顺序很重要!lapack必须先来,然后是f2c,然后是blas.
真正需要确保的是,编译时包含交叉编译的armadillo目录,并且如上所述正确设置了链接.
再次提供更多信息,请随时添加更多评论.对我有用的不同之处在于我做了什么,我做错了什么,可以做些什么来改进.
谢谢.
| 归档时间: |
|
| 查看次数: |
5075 次 |
| 最近记录: |