我的具体设置是 OSX (IDE Eclipse) 交叉编译为 Beaglebone Black。但是,这些说明应该适用于类似的设置。
可选:
为了编译,我使用了Mac OS X ARM GNU Linux G++ Lite 2013.11-33 Toolchain。具体来说,ARM GNU/Linux G++ Lite 2013.11-33 Advanced Binary。
1。下载:
正如 Matt 发布的那样,GCC 交叉编译器不支持 Fortran,因此如果您想编译 LAPACK 和 BLAS,请使用找到的修改版本 here。我使用的是clapack-3.2.1-CMAKE.tgz
2。制作交叉编译的cmake文件:
您可以使用工具链构建器,也可以只编写一个。我写了一个。
例子:
# http://www.cmake.org/Wiki/CMake_Cross_Compiling#The_toolchain_file
# REQUIRED
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_SYSTEM_PROCESSOR arm)
# Added for the beaglebone
SET(FLOAT_ABI_SUFFIX "")
# specify the cross compiler
SET(CMAKE_C_COMPILER /usr/local/arm-2013.11/bin/arm-none-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER /usr/local/arm-2013.11/bin/arm-none-linux-gnueabi-c++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /usr/local/arm-2013.11)
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
注意:这是我第一次制作 cmake 文件。不保证正确。
您需要将 /usr/local/arm-2013.11/bin/arm-none-linux-gnueabi-gcc 替换为您选择的编译器的路径,以及 /usr/local/arm-2013.11/bin /arm-none-linux-gnueabi-c++ 和 /usr/local/arm-2013.11
我选择将这个 cmake 文件保存为 beaglebone.cmake
3。编译:
提取 clapack-3.2.1-CMAKE.tgz 和 cd
编译:cmake -DCMAKE_TOOLCHAIN_FILE=~/Dropbox/workspaces/beaglebone/beaglebone.cmake
其中 ~/Dropbox/workspaces/beaglebone/beaglebone.cmake 是您的 cmake 文件的路径。
制作
由于某种原因,我得到:
ds-mac-pro:clapack-3.2.1-CMAKE bunny$ make
Scanning dependencies of target arithchk
[ 0%] Building C object F2CLIBS/libf2c/CMakeFiles/arithchk.dir/arithchk.c.o
Linking C executable arithchk
[ 0%] Built target arithchk
[ 0%] Generating arith.h
/bin/sh: arithchk: command not found
make[2]: *** [F2CLIBS/libf2c/arith.h] Error 127
make[1]: *** [F2CLIBS/libf2c/CMakeFiles/f2c.dir/all] Error 2
make: *** [all] Error 2
奇怪的是,再次运行 make 编译正常:
ds-mac-pro:clapack-3.2.1-CMAKE bunny$ make
[ 0%] Built target arithchk
Scanning dependencies of target f2c
[ 0%] Building C object F2CLIBS/libf2c/CMakeFiles/f2c.dir/f77vers.c.o
[ 0%] Building C object F2CLIBS/libf2c/CMakeFiles/f2c.dir/i77vers.c.o
[ 0%] Building C object F2CLIBS/libf2c/CMakeFiles/f2c.dir/main.c.o
[ 0%] Building C object F2CLIBS/libf2c/CMakeFiles/f2c.dir/s_rnge.c.o
...
[100%] Building C object TESTING/EIG/CMakeFiles/xeigtstz.dir/xerbla.c.o
[100%] Building C object TESTING/EIG/CMakeFiles/xeigtstz.dir/xlaenv.c.o
[100%] Building C object TESTING/EIG/CMakeFiles/xeigtstz.dir/chkxer.c.o
[100%] Building C object TESTING/EIG/CMakeFiles/xeigtstz.dir/__/__/INSTALL/dsecnd.c.o
Linking C executable xeigtstz
[100%] Built target xeigtstz
4。复制(安装):
find . | grep \.a$
返回
./BLAS/SRC/libblas.a
./F2CLIBS/libf2c/libf2c.a
./SRC/liblapack.a
./TESTING/MATGEN/libtmglib.a
cp libblas.a libf2c.a 和 liblapack.a 到您最喜欢的库文件夹。我做了 /usr/local/armadillo-4.300.3/lib
必填:
1。文案包括:
犰狳不需要编译。我没有运行任何基准测试来验证,但似乎使用 LAPACK 和 BLAS 通过在代码中使用 #define 可以很好地处理未编译的犰狳副本。稍后编写代码示例。
提取 armadillo-4.300.3.tar.gz
(可选)cp armadillo-4.300.3/include/ /usr/local/armadillo-4.300.3/include
当然,将 /usr/local/armadillo-4.300.3/include 替换为您选择的路径
2。设置 GCC 以使用 Armadillo:
我正在使用带有 C/C++ 交叉编译器支持插件的 Eclipse(帮助菜单 -> 安装新软件...),但说明很容易转换为 cli 或其他 IDE。
在项目属性窗口中:C/C++ Build -> Settings
Cross G++ 编译器 -> 包含 -> 包含路径 (-I)
单击 + 以添加包含。我的包含路径是:/usr/local/armadillo-4.300.3/include
3。可选 - 设置 GCC 以使用已编译的库:
Cross G++ 链接器 -> 库 ->
库 (-l)
拉包
f2c
废话
库搜索路径 (-L)
单击 + 添加路径。我的路径是:/usr/local/armadillo-4.300.3/lib
3。代码示例:
在 cpp 文件中尝试:
#include <armadillo>
using namespace arma;
mat A = randu<mat>(4,5);
mat B = randu<mat>(4,5);
std::cout << A*B.t() << std::endl;
成功! :D
犰狳不直接支持某些功能,仅适用于已编译的库。您可以通过运行以下简单测试来测试库是否已编译并正常工作:
#define ARMA_DONT_USE_WRAPPER
#define ARMA_USE_LAPACK
#define ARMA_USE_BLAS
#include <armadillo>
using namespace arma;
mat A = randu<mat>(5,5);
double x = det(A);
std::cout << x << std::endl;