Кросс-Компиляция Библиотеки Линейной Алгебры Броненосца
и Библиотека Линейной Алгебры Броненосца. Это становится чрезвычайно приятно при переносе октавы .M файлов на C++, особенно когда вам нужно использовать собственные методы.
однако я столкнулся с проблемами, когда мне пришлось взять мою программу из моего родного vanilla G++ и сбросить ее на процессор ARM. Поскольку я провел несколько часов, путаясь в пути, хотя я хотел поделиться, чтобы другие могли избежать некоторого разочарования.
Если кто-нибудь еще может добавить что-нибудь иначе мне бы понравилось. Это был процесс, который я использовал для решения этой проблемы, и, конечно, это не единственный или лучший подход.
2 ответов
во-первых, я использую Sourcery Код как мой кросс-компилятор. Я знаю, что есть другие, но я еще не перестроился для другого компилятора, независимо от того, что это должно быть применимо к любому компилятору.
информация:
библиотека Armadillo требует LAPACK и BLAS, но код Sourcery не имеет компилятора Fortran. Это привело меня к f2c'Ed версии LAPACK и BLAS.
1. Получить источники:
во-первых возьми источников.
2. Кросс-компиляция CLAPACK
как только у нас есть источники, следующее, что нужно сделать, это скомпилировать их для нашего конечного оборудования. В моем случае ARM7 использует CodeSourcery. Его действительно хорошая идея прочитать READMEs здесь, вы действительно можете сделать все это, просто потратив время и чтение их.
-
Первое, что нужно сделать, это изменить сделать.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
-
скомпилируйте библиотеки 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.ля." Это твой кросс-скомпилированная библиотека BLAS.
-
компилировать 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;