Кросс-Компиляция Библиотеки Линейной Алгебры Броненосца

и Библиотека Линейной Алгебры Броненосца. Это становится чрезвычайно приятно при переносе октавы .M файлов на C++, особенно когда вам нужно использовать собственные методы.

однако я столкнулся с проблемами, когда мне пришлось взять мою программу из моего родного vanilla G++ и сбросить ее на процессор ARM. Поскольку я провел несколько часов, путаясь в пути, хотя я хотел поделиться, чтобы другие могли избежать некоторого разочарования.

Если кто-нибудь еще может добавить что-нибудь иначе мне бы понравилось. Это был процесс, который я использовал для решения этой проблемы, и, конечно, это не единственный или лучший подход.

2 ответов


во-первых, я использую Sourcery Код как мой кросс-компилятор. Я знаю, что есть другие, но я еще не перестроился для другого компилятора, независимо от того, что это должно быть применимо к любому компилятору.

информация:

библиотека Armadillo требует LAPACK и BLAS, но код Sourcery не имеет компилятора Fortran. Это привело меня к f2c'Ed версии LAPACK и BLAS.

1. Получить источники:

во-первых возьми источников.

2. Кросс-компиляция CLAPACK

как только у нас есть источники, следующее, что нужно сделать, это скомпилировать их для нашего конечного оборудования. В моем случае ARM7 использует CodeSourcery. Его действительно хорошая идея прочитать READMEs здесь, вы действительно можете сделать все это, просто потратив время и чтение их.

  1. Первое, что нужно сделать, это изменить сделать.inc файл, чтобы посмотреть на наш кросс-компилятор вместо обычного GCC. Обычно вы бы экспортировали$, но мне было легче отслеживать, изменяя файлы 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
    
  2. скомпилируйте библиотеки 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
    

    нет актуальной проблемой здесь. Конечно, у него будут проблемы с выполнением,он был скомпилирован!

  3. компиляция BLAS:

    $make blaslib
    

    как только это будет сделано, вы заметите, что у вас есть новый "blas_XXXXX.ля." Это твой кросс-скомпилированная библиотека BLAS.

  4. компилировать LAPACK:

    сделать.inc укажет вам использовать $make lapacklib, но это приведет к попытке большего выполнения кросс-скомпилированных элементов. Вместо $cd в каталог SRC и:

    $make
    

    это должно генерировать ваш новый " lapack_XXXXX.ля." Теперь, когда у нас есть наши F2C, LAPACK и BLAS, я рекомендую разместить их где-то, что имеет смысл, чтобы вы могли найти их позже. В моем случае я поместил их туда, где Я сохраняю свой компилятор кода 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. Кросс-компиляция броненосца

во-первых, прочитайте README, всегда лучшее место для начать.
Идите вперед и бегите:

    $cmake .

это будет получить все готово и генерировать все cmake потребуется для создания нашей общей библиотеки броненосца. То, как я действовал здесь, не так, как я думаю, что вы должны, но поскольку я не волшебник с makefiles в целом, я подумал, что было бы полезно показать, что я сделал, чтобы заставить его скомпилировать. Я изменил созданный CMakeCache.txt строки со следующим:

    //CXX compiler.
    CMAKE_CXX_COMPILER:FILEPATH=[CROSS-COMPILER-G++ location]

я знаю, что где-то в это 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

единственное, что осталось сделать, это $cd вернуться к корню каталога armadillo и

    $make

после завершения make вы сможете использовать Armadillo в своих программах.

4. Использование ARMADILLO в вашей программе

чтобы использовать Armadillo в вашей программе, добавьте include #include <armadillo> и пространство имен using namespace arma;. Теперь вы должны иметь возможность использовать все vec и mat вы себя чувствуете. Обычно при использовании arma все, что вам нужно сделать во время компиляции, это связать libarmadillo.Итак, библиотека, но, как я уже говорил ранее, нам нужно будет напрямую связать Бласа и ЛАПАКА. Итак, вот мой компилятор 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, затем смещение.

на самом деле все, что вам нужно, чтобы убедиться, что происходит, это то, что кросс-скомпилированный каталог armadillo включен при компиляции, и ваша ссылка настроена правильно, как указано выше.

еще больше информации лучше, пожалуйста, не стесняйтесь добавлять больше комментариев. Что работал для вас, что я сделал, что я сделал неправильно, что можно сделать для улучшения.

спасибо.


моя конкретная настройка - OSX (IDE Eclipse), скомпилированный в черный Beaglebone. Однако эти инструкции должны работать для аналогичных установок.

дополнительно:

для компиляции я использовал Mac OS X ARM GNU Linux G++ Lite 2013.11-33 Toolchain. В частности, ARM GNU/Linux G++ Lite 2013.11-33 расширенный двоичный файл.

1. Скачать:

так же, как Мэтт опубликовал, компилятор GCC cross не поддерживает Fortran, поэтому, если вы хотите скомпилируйте LAPACK и BLAS, используйте найденную измененную версию здесь. Я использую это clapack-3.2.1-CMAKE.tgz

2. Сделайте кросс-компиляцию cmake-файла:

вы можете использовать toolchain builder или просто написать один. Я написал одну.

пример:

# 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. Compile:

извлечь clapack-3.2.1-CMAKE.tgz и cd

compile: cmake-DCMAKE_TOOLCHAIN_FILE=~/Dropbox/рабочие пространства/beaglebone/beaglebone.с CMake
где ~/Dropbox/рабочие пространства / 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

СР libblas.libf2c.a и liblapack.в любимую папку библиотеки. Я сделал / usr / местный / броненосец-4.300.3 / lib

требуется:

1. Копия Включает В Себя:

броненосец не нужно скомпилировать. Я не запускал никаких тестов для проверки, но похоже, что использование LAPACK и BLAS отлично работает с несжатой копией Armadillo, используя #define в коде. Примеры кода позже.

извлечь броненосца-4.300.3.смола.gz

(необязательно) CP armadillo-4.300.3/include/ /usr/local/armadillo-4.300.3/include
и, конечно же, замените /usr / local / armadillo-4.300.3 / include на ваш путь выбора

2. Настройка GCC для использования Броненосец:

Я использую Eclipse с помощью C / C++ Cross Compiler Support addon (меню справки -> установить новое программное обеспечение...), но инструкции легко преобразовать в cli или другие IDEs.

в окне свойств проекта: C / C++ Build - > Settings

кросс-компилятор G++ - > включает - > включить пути (- I)

Нажмите+, чтобы добавить include. Мой путь включения: / usr/local/armadillo-4.300.3 / include

3. Необязательно-настройка GCC для использования скомпилированные библиотеки:

Кросс-Компоновщик G++ - > Библиотеки ->

библиотеки (- l)

lapack
завод f2c
Блас!--9-->

Путь Поиска Библиотеки (- 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

некоторые функции Armadillo напрямую не поддерживает и будет работать только с скомпилированные библиотеки. Вы можете проверить, что библиотеки скомпилированы и работают правильно, выполнив простой тест, например:

#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;