gpt4 book ai didi

交叉编译 Armadillo 线性代数库

转载 作者:行者123 更新时间:2023-12-04 13:32:24 60 4
gpt4 key购买 nike

我喜欢使用 Armadillo Linear Algebra Library .当将 Octave .m 文件移植到 C++ 时,它变得非常好,尤其是当您必须使用特征方法时。

然而,当我不得不从我的原生 vanilla G++ 中获取我的程序并将其转储到我的 ARM 处理器时,我遇到了问题。由于我花了几个小时摸索着自己的方式,尽管我想分享,所以其他人可能会避免一些挫折。

如果其他人可以添加任何其他内容,我会喜欢它。这是我用来解决这个问题的过程,当然不是唯一或最好的方法。

最佳答案

首先我使用 Code Sourcery作为我的交叉编译器。我知道那里还有其他人,但我还没有开始为另一个编译器重建,不管这应该适用于任何编译器。

信息:

Armadillo 库需要 LAPACK 和 BLAS,但 Code Sourcery 没有 Fortran 编译器。这让我找到了 LAPACK 和 BLAS 的 f2c 版本。

1. 获取来源:

首先去抢资源。

  • Armadillo
  • LAPACK & BLAS

  • 2. 交叉编译 CLAPACK

    一旦我们获得了源代码,接下来要做的就是为我们的最终硬件交叉编译它们。就我而言,使用 CodeSourcery 的 ARM7。它是 真的阅读这里的自述文件是个好主意,你真的可以通过花时间阅读它们来完成所有这些。
  • 首先要做的是更改 make.inc 文件以查看我们的交叉编译器而不是普通的 GCC。通常你会 $export,但我发现通过修改 makefile 更容易跟踪。

    从以下位置编辑 clapack-3.2.1-CMAKE/make.inc:
    CC = GCC
    LOADER = GCC

    到:
    CC = [CROSS-COMPILER-GCC location]
    LOADER = [CROSS-COMPILER-GCC location]

    从以下位置编辑 clapack-3.2.1-CMAKE/F2CLIBS/libf2c/Makefile:
    ld -r -x -o $*.xxx $*.o

    到:
    [CROSS-COMPILER-LD location] -r -x -o $*.xxx $*.o
  • 编译 f2c 库:
    $make f2clib

    当我制作 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

    这里没有实际问题。当然执行起来会有问题,它是交叉编译的!
  • 编译BLAS:
    $make blaslib

    完成此操作后,您会注意到您有一个新的“blas_XXXXX.a”。这是您交叉编译的 BLAS 库。
  • 编译LAPACK:

    make.inc 将指示您使用 $make lapacklib ,但这将导致它尝试更多地执行交叉编译项目。而是 $cd进入 SRC 目录并:
    $make

    这应该会生成您的新“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

    请记住,他们必须拥有稍后才能识别的“lib”。再次继续并将这些存储在您的交叉编译库位置。我用我的工具链设置了它,使其更容易与普通的 gcc/g++ 分离。

  • 3. 交叉编译 Armadillo

    首先阅读自述文件,它始终是最好的起点。
    继续运行:
        $cmake .

    这将使一切准备就绪,并生成 cmake 创建我们共享的 Armadillo 库所需的一切。我在这里进行的方式并不是我认为您应该采用的方式,但是由于我通常不是使用 makefile 的向导,因此我认为展示我为使其交叉编译所做的工作会有所帮助。
    我使用以下内容修改了生成的 CMakeCache.txt 行:
        //CXX compiler.
    CMAKE_CXX_COMPILER:FILEPATH=[CROSS-COMPILER-G++ location]

    我知道在 CMakeCache.txt 文件中的某个地方您可以指定我们的 BLAS 和 LAPACK 位置的路径,但我很难弄清楚。我没有抨击这个问题,而是修改了“CMakeFiles/armadillo.dir/link.txt”并手动添加了“-L [Cross-Compiled BLAS/LAPACK directory]。更熟悉如何做到这一点的人可以在评论?
    接下来,因为我们想在稍后编译我们的程序时手动链接 BLAS 和 LAPACK 库(如自述文件所说)修改“include/armadillo_bits/config.hpp”并确保定义使用 arma 包装器的行被注释掉:
        //  #define ARMA_USE_WRAPPER

    唯一要做的就是 $cd回到 Armadillo 目录的根目录,然后
        $make

    一旦 make 完成,您应该能够在您的程序中使用 Armadillo 。

    4. 在你的程序中使用 Armadillo

    要在您的程序中使用 Armadillo ,请添加包含 #include <armadillo>和命名空间 using namespace arma; .现在您应该可以使用所有 vecmat你感觉。
    通常在使用 arma 时,您需要在编译时做的就是链接 libarmadillo.so 库,但正如我之前所说,我们需要直接链接 BLAS 和 LAPACK。所以这是我的 GCC C++ 编译器 Synatx:
        [CROSS-COMPILER-G++] -I [CROSS-COMPILED ARMADILLO DIRECTORY]/include ...

    和我的链接器:
        [CROSS-COMPILER-G++] -L [CROSS-COMPILED LIBRARY] -o ... -llapack -lf2c -lblas

    另请注意,链接库的顺序很重要! lapack 必须先来,然后是 f2c,然后是 blas。

    实际上,您只需要确保在编译时包含交叉编译的 Armadillo 目录,并且您的链接设置正确,如上所示。

    再次提供更多信息更好,请随时添加更多评论。对你有用的东西与我所做的不同,我做错了什么,可以做些什么来改进。

    谢谢。

    关于交叉编译 Armadillo 线性代数库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21263427/

    60 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com