Тема кросс-компиляции несомненно важная. В процессе работы над различными проектами, вполне возможно, что появится необходимость в компиляции программы под различные архитектуры без прямого доступа к устройствам на нужной архитектуре. Самый обычный пример - скомпилировать файловый менеджер для машинки Raspberry Pi, но делать это непосредственно на "пироге" затея, предполагающая потратить кучу времени на ожидание (не учитывая различные проблемы и ошибки, которые, уж поверьте, будут).
Поэтому я посвящу пару записей на данную тему, поскольку подобные задачи недавно возникали у меня, с которыми мне все-таки удалось справится. И мне бы хотелось поделится полученным опытом с общественностью.
Собственно, какая задача, какие исходные данные, какие средства. Задача - скомпилировать известный файловый менеджер Midnight Commander (mc) под систему с архитектурой ARM. В наших руках компьютер с процессором Intel, с операционной системой Ubuntu 14.04. В качестве компилятора будем использовать пакет gcc-4.7-arm-linux-gnueabi, который отлично пребывает на репозиториях. Исходный материал - исходные коды необходимых библиотек и код самого mc.
Сперва начнем с простого - установка инструментов для кросс-компиляции. Происходит все это очень просто:
# apt-get install gcc-4.7-arm-linux-gnueabi
# apt-get install gcc-arm-linux-gnueabi
Это дело работает как gcc, вызывать компилятор можно так: arm-linux-gnueabi-gcc. Все возможности смотрите тут: man arm-linux-gnueabi-gcc.
Шаг 2 - загружаем исходники. На потребуются следующие исходники:
- mc-4.8.14
- check-0.10.0
- libffi-3.2.1
- zlib-1.2.8
- glib-2.44.1
- ncurses-5.9
Это минимальный список исходников, которые позволят успешно использовать mc. Я забочусь о читателях, поэтому архивчик со всеми необходимыми исходниками можно загрузить ниже (если ссылка битая, или еще чего нибудь приключилось, то придется искать самостоятельно).
Шаг 3 - подготовка к кросс-компиляции. Сейчас нам необходимо подготовить скаченные исходники к компиляции. Но сначала один нюанс - мне так и не удалось скомпилировать mc с относительными путями. Кто не в курсе, проблема вот в чем - при компиляции определенных библиотек, им необходимо указывать пути до уже скомпилированных зависимых библиотек. Собственно, при компиляции самого mc нужно скармливать ему вышеприведенные либы. Указав полные пути (а конфигурационные скрипты почему то требуют указывать именно абсолютные пути), ваш mc запустится только по таким путям файловой системы, в которых все было скомпилированно. Например, если вы решили все собрать тут: /home/username/arm_mc, то ваша программа на другом компьютере запустится лишь только в /home/username/arm_mc, при условии что все зависимые библиотеки также находятся в тех местах, на которые указывалось при кросс-компиляции. Это проблема, которую я не смог решить, буду очень благодарен, если кто либо расскажет, как правильно это сделать.
Поэтому для нашего случая мы воспользуемся самым простым вариантом: все компилировать будем сюда /tmp/mc_build/builds, и запускать все будем также по тому пути (если вы решились делать так, то не забывайте особенность каталога tmp - после перезагрузки системы, данный каталог чистится).
Поэтому делаем следующее:
$ mkdir /tmp/mc_build
$ mkdir /tmp/mc_build/builds
$ mkdir /tmp/mc_build/sources
В каталог /tmp/mc_build/sources кладем наш архив mc_src.tar.gz и выполняем разархивацию в данный каталог содержимого всех архивов руками, либо так (перед выполнением сначала перейдите в каталог с архивом):
$ tar -xf mc_src.tar.gz && for f in *.tar*; do tar xf $f; done
Шаг 4 - компиляция. Процесс компиляции на самом деле очень прост, за нас, по сути, разработчики уже позаботились, создали скрипты конфигурации и make-файлы, которые всю грязную работу выполняют сами. От нас лишь требуется правильно предоставить требуемые зависимости и скормить скриптам нужные флаги и параметры. Как это делать будем мы: необходимо будет создавать исполняемый bash-скрипт в корне каталога компилируемой библиотеки, прописывать в данный скрипт нужные команды и выполнять этот скрипт. Собственно, займемся данным, достаточно рутинным, процессом. Для первой библиотеки я распишу полную последовательность команд, для оставшихся я приведу лишь тексты bash-скриптов.
Компиляция check-0.10.0:
Создаем файл скрипта в корне:
$ touch /tmp/mc_build/sources/check-0.10.0/my_make
Открываем его любым текстовым редактором, например:
$ nano /tmp/mc_build/sources/check-0.10.0/my_make
Копируем в этот файл следующий текст:
1 2 3 4 5 6 7 8 |
#!/bin/bash ARCH=arm \ CC=arm-linux-gnueabi-gcc ./configure \ --host=arm-linux-gnueabi \ --prefix=/tmp/mc_build/builds/build_check-0.10.0/ \ --enable-static=yes make sudo make install |
Даем данному скрипту права на выполнение:
$ chmod 755 /tmp/mc_build/sources/check-0.10.0/my_make
И выполняем данный скрипт:
$ cd /tmp/mc_build/sources/check-0.10.0
$ ./my_make
В случае успешного завершения процесса компиляции, в каталоге /tmp/mc_build/builds/ будет лежать каталог build_check-0.10.0 - это продукт нашей компиляции. В случае если такого каталога нету, либо он пустой - произошла ошибка, необходимо читать что нам в консоли сообщает make, либо скрипт configure и пытаться исправить. Для справки, где есть полезная информация, можно выполнить следующее:
$ /tmp/mc_build/sources/check-0.10.0/configure --help
Таким же образом происходит компиляция всего остального (копируете скрипт my_make, даете ему права на исполнение, запускаете, надеетесь, чтобы не было ошибок). Поэтому далее я лишь приведу скрипты my_make для каждой библиотеки. Компилировать, кстати, библиотеки нужно в том порядке, в котором я привожу тексты скриптов.
Компиляция libffi-3.2.1:
1 2 3 4 5 6 7 8 |
#!/bin/bash ARCH=arm \ CC=arm-linux-gnueabi-gcc ./configure \ --host=arm-linux-gnueabi \ --prefix=/tmp/mc_build/builds/build_libffi-3.2.1 \ --enable-static=yes make sudo make install |
Компиляция zlib-1.2.8:
UPD: У некоторых при использовании данного скрипта для компиляции zlib появляются ошибки вроде:
1 |
"Compiler error reporting is too harsh for ./configure (perhaps remove -Werror). ** ./configure aborting." |
Логи configure.log говорят, что, почему то, arm-linux-gnueabi-gcc не понимает строку
1 |
--archs="-arch arm" |
в данном скрипте. Поэтому решение - убрать (закомментировать) эту строчку из нижеприведенного скрипта.
1 2 3 4 5 6 7 |
#!/bin/bash ARCH=arm \ CC=arm-linux-gnueabi-gcc ./configure \ --static \ --archs="-arch arm" make sudo make install DESTDIR=/tmp/mc_build/builds/build_zlib-1.2.8 |
Компиляция ncurses-5.9:
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash ARCH=arm \ CC=arm-linux-gnueabi-gcc ./configure \ --target=arm-linux-gnueabi \ --with-gcc=arm-linux-gnueabi-gcc \ --host=arm-linux-gnueabi \ --prefix=/tmp/mc_build/builds/build_ncurses-5.9 \ --enable-static=yes make sudo make install |
Компиляция glib-2.44.1:
UPD: как справедливо заметили в комментариях, в процессе сборки могут появиться ошибки о проблемах с glib-genmarshal. Предложенный вариант решения - установка пакета:
# sudo apt-get install libglib2.0-dev
Должно заработать.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash echo "glib_cv_stack_grows=no" > arm-linux.cache echo "glib_cv_uscore=no" >> arm-linux.cache echo "ac_cv_func_posix_getpwuid_r=no" >> arm-linux.cache echo "ac_cv_func_posix_getgrgid_r=no" >> arm-linux.cache ARCH=arm \ CC=arm-linux-gnueabi-gcc ./configure \ ZLIB_CFLAGS="-I/tmp/mc_build/builds/build_zlib-1.2.8/usr/local/include/" \ ZLIB_LIBS="-L/tmp/mc_build/builds/build_zlib-1.2.8/usr/local/lib -lz" \ LIBFFI_CFLAGS="-I/tmp/mc_build/builds/build_libffi-3.2.1/lib/libffi-3.2.1/include" \ LIBFFI_LIBS="-L/tmp/mc_build/builds/build_libffi-3.2.1/lib -lffi" \ --host=arm-linux-gnueabi \ --prefix=/tmp/mc_build/builds/build_glib-2.44.1 \ --enable-static=yes \ --cache-file=arm-linux.cache make sudo make install |
Компиляция mc-4.8.14:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/bash ARCH=arm \ CC=arm-linux-gnueabi-gcc ./configure \ CHECK_CFLAGS="-I/tmp/mc_build/builds/build_check-0.10.0/include/" \ CHECK_LIBS="-L/tmp/mc_build/builds/build_check-0.10.0/lib/ -lcheck" \ GLIB_CFLAGS="-I/tmp/mc_build/builds/build_glib-2.44.1/include/glib-2.0 -I/tmp/mc_build/builds/build_glib-2.44.1/lib/glib-2.0/include" \ GLIB_LIBS="-L/tmp/mc_build/builds/build_glib-2.44.1/lib -lglib-2.0" \ GMODULE_CFLAGS="-I/tmp/mc_build/builds/build_glib-2.44.1/include/glib-2.0 -I/tmp/mc_build/builds/build_glib-2.44.1/lib/glib-2.0/include" \ GMODULE_LIBS="-L/tmp/mc_build/builds/build_glib-2.44.1/lib/glib-2.0 -lgmodule-2.0" \ --host=arm-linux-gnueabi \ --prefix=/tmp/mc_build/builds/build_mc-4.8.14 \ --enable-static=yes \ --with-screen=ncurses \ --with-ncurses-includes="/tmp/mc_build/builds/build_ncurses-5.9/include" \ --with-ncurses-libs="/tmp/mc_build/builds/build_ncurses-5.9/lib" make sudo make install |
В случае, если у вас после все выше проделанного появилась папочка /tmp/mc_build/builds/build_mc-4.8.14 - поздравляю, у вас, наверно, удалась кросс-компиляция файлового менеджера Midnight Commander под архитектуру ARM.
Далее действия просты - загружаем каталог /tmp/mc_build/builds на нужную систему по одноименному пути, и запускаем mc: /tmp/mc_build/builds/build_mc-4.8.14/bin/mc. Все должно работать.
Для знатоков - в данном примере в качестве графической библиотеки использовалась библиотека ncurses, поскольку это попроще в плане сборки. Есть вариант использовать библиотеку slang (для данного примера версии 2.3.0), но это более сложная задача, поскольку slang имеет слегка больше зависимостей. Можете попробовать, у меня пока не получилось.
Всем спасибо, ставьте лайки, подписывайтесь на мой канал, всем пока!
Архив со всеми исходниками: ССЫЛКА
Замечательная статья дружище. Добавь пожалуйста что кроме установки gcc-4.7-arm-linux-gnueabi нужно еще установить arm-linux-gnueabi-gcc. А при сборке glib-2.44.1 нужно установить libglib2.0-dev иначе выдает ошибку и останов.
И еще. C ncurses проблемы — не компилится то не может найти заголовки то libs. Компилировал без него. Еще. Он не компилируется без библиотек slang. Нужно собирать и ее.
Спасибо за полезный комментарий!
Да, действительно, для корректной компиляции библиотек необходим еще пакет gcc-arm-linux-gnueabi. А для сборки glib может потребоваться библиотека libglib2.0-dev. Добавил изменения в статью.
Но вот на счет ncurses и slang — это две взаимозаменяемые графические библиотеки для mc. Поэтому одна не требует наличия другой. По умолчанию, mc компилируется с slang, но в данной статье использовалась библиотека ncruses. По функционалу для mc они практически не отличаются, поэтому с какой быстрее и удобнее собирать, ту и стоит выбрать. Если с ncurses не получается, то можно попробовать собрать с slang, но это чуть сложнее, поскольку у нее больше зависимостей.
Я видимо несколько сумбурно написал. Но Вы поняли мою мысль. Только что собрал mc с ncurses. Дело все в том, что у меня стояла задача скомпилировать mc под nas seagate central. Там немного хитрый arm-процессор поэтому обычно скомпилированный mc просто не запустится. Ваша статья очень помогла с основными моментами, спасибо. Я написал свою статью, естественно со ссылкой на Вашу, в которой указал дополнительные флаги, необходимые для правильной компиляции под тот процессор. Cсылку на нее я не привожу дабы не загаживать Вам ссылочную массу.
Здравствуйте. Подскажите новичку. Как Вы определяете что еще потребуется компилировать для нужной вам программы. Ну, почему для mc потребуются еще пять исходников?
Здравствуйте!
Ну первое, что следует читать перед компиляцией — это файл README, который должен находиться в корне исходников любой крупной программы. То есть обращаться к первоисточнику. Обычно (но не всегда) разработчики в данном файле описывают все основные моменты, которые должны знать пользователи. Например, в случае mc, в файле README в разделе Dependencies (зависимости) написано, что вся информация про установку mc находится в файле INSTALL — а там уже все подробно описано, какие библиотеки нужны для сборки данной версии программы.
Второй вариант, менее правильный — начать сборку программы сразу без чтения документации. Это работает только с крупными и известными программами с хорошими скриптами сборки. Потому что при сборке без нужных библиотек (обычно при запуске скрипта configure) в терминал будет выведена ошибка с наименованием библиотеки, которая требуется. Так, библиотеку за библиотекой по очереди добавлять, пока ошибки перестанут приходить.
Ну и третий вариант — воспользоваться Интернетом. В сети, особенно в англоязычном сегменте, наверняка имеются полные списки зависимостей для большинства крупных программ.
Данных трех вариантов мне всегда хватало для успешной компиляции большинства программ.
Спасибо.
А что вот эти три строчки означают
#!/bin/bash
ARCH=arm \
CC=arm-linux-gnueabi-gcc ./configure \
Почему нельзя просто ввести
~$ arm-linux-gnueabi-gcc (имя файла исходника) -o(имя исполнительного файла)
Извините за глупые вопросы, я с линуксом раньше дело не имел
Кажется понял. Скрипт Configure есть в каждой папке, и он является аргументом для компилятора
А вот что задает
#!/bin/bash
ARCH=arm
Это должна быть папка с архивом /arm ?
Да, скрипт configure присутствует во всех программах, которые используют утилиту Autoconf для сборки проекта.
В данной статье я предлагаю проводить сборку midnight commander с использованием своих собственных bash-скриптов. А в bash-скриптах первой строкой обязательно нужно обозначать путь в системе к bash-интерпретатору, который и выглядит обычно таким образом: #!/bin/bash.
Флагом ARCH обозначается архитектура, под которую производится кросс-компиляция. В данной статье производилась кросс-компиляция для процессоров arm.
И еще, насколько я помню, раньше были отдельно компилятор и отдельно линковщик. Сейчас все в одном?
Далее. Фраза: «Создаем файл скрипта в коре:»
Что такое коре, это специальный текстовый редактор?
Не совсем понимаю вопрос, что имеется в виду под «отдельно компилятор и линковщик»? Они до сих пор раздельны в этапах сборки программы и имеется возможность отдельно вызывать их по очереди. Это и происходит при сборке программы с помощью утилиты make, которую мы вызываем в скриптах в статье.
А на счет фразы — это была опечатка =) Имелось в виду, что необходимо создать пустой файл в корне каталога /tmp/mc_build/sources/check-0.10.0/my_make. Спасибо, что указали на опечатку!
Большое спасибо за ответы.
Это я по системе DOS помню что сначала компилировали, получали объектный файл, а потом выполняли link который был в комплекте компилятора и получали уже исполняемый файл. Тут видно уже эти операции совместили.
Я просто пытаюсь скомпилировать mc для платформы powerpc, вот и корректирую для него файлы makefile. Компилятор у него свой powerpc-e300c3-linux, на Hello words я его проверил, работает
Так же происходит и в Linux с использованием gcc — сначала все компилируется, преобразовываясь в объектные файлы, а далее все это собирается компоновщиком/линковщиком в исполняемый файл. Просто в данном случае используется специальная утилита make, которая сама за разработчика выполняет эти действия. Разработчик лишь настраивает её работу, указывая какие модули программного проекта необходимо компилировать. А в случае mc еще используется утилита Autoconf, которая создает конфигурационные скрипты (configure) под платформу и потом сама генерирует эти самые файлы — makefile, для которых достаточно вызвать make.
Все пытаюсь скомпилировать check-0.10.0
Подскажите, что я делаю не так?
my_make
#!/bin/bash
ARCH=ppc \
CC=powerpc-e300c3-linux-gcc-4.0.2 ./configure \
—host=powerpc-e300c3-linux \
—prefix=/home/mc_builds/build_check-0.10.0/ \
—enable-static=yes
make
sudo make install
config.log
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by Check configure 0.10.0, which was
generated by GNU Autoconf 2.68. Invocation command line was
$ ./configure —host=powerpc-e300c3-linux —prefix=/home/mc_builds/build_check-0.10.0/ —enable-static=yes
## ——— ##
## Platform. ##
## ——— ##
hostname = Linux90
uname -m = i686
uname -r = 2.4.20-8
uname -s = Linux
uname -v = #1 Thu Mar 13 17:54:28 EST 2003
/usr/bin/uname -p = unknown
/bin/uname -X = unknown
/bin/arch = i686
/usr/bin/arch -k = unknown
/usr/convex/getsysinfo = unknown
/usr/bin/hostinfo = unknown
/bin/machine = unknown
/usr/bin/oslevel = unknown
/bin/universe = unknown
PATH: /usr/local/sbin
PATH: /usr/local/bin
PATH: /sbin
PATH: /bin
PATH: /usr/sbin
PATH: /usr/bin
PATH: /opt/wisermind_MPS83xx/
PATH: /usr/X11R6/bin
PATH: /root/bin
## ———— ##
## Core tests. ##
## ———— ##
configure:2707: checking for a BSD-compatible install
configure:2775: result: /usr/bin/install -c
configure:2786: checking whether build environment is sane
configure:2836: result: yes
configure:2885: checking for powerpc-e300c3-linux-strip
configure:2915: result: no
configure:2925: checking for strip
configure:2941: found /usr/bin/strip
configure:2952: result: strip
configure:2977: checking for a thread-safe mkdir -p
configure:3016: result: /bin/mkdir -p
configure:3029: checking for gawk
configure:3045: found /bin/gawk
configure:3056: result: gawk
configure:3067: checking whether make sets $(MAKE)
configure:3089: result: yes
configure:3186: checking for style of include used by make
configure:3214: result: GNU
configure:3245: checking for powerpc-e300c3-linux-gcc
configure:3272: result: powerpc-e300c3-linux-gcc-4.0.2
configure:3541: checking for C compiler version
configure:3550: powerpc-e300c3-linux-gcc-4.0.2 —version >&5
./configure: line 1: powerpc-e300c3-linux-gcc-4.0.2: command not found
configure:3561: $? = 127
configure:3550: powerpc-e300c3-linux-gcc-4.0.2 -v >&5
./configure: line 1: powerpc-e300c3-linux-gcc-4.0.2: command not found
configure:3561: $? = 127
configure:3550: powerpc-e300c3-linux-gcc-4.0.2 -V >&5
./configure: line 1: powerpc-e300c3-linux-gcc-4.0.2: command not found
configure:3561: $? = 127
configure:3550: powerpc-e300c3-linux-gcc-4.0.2 -qversion >&5
./configure: line 1: powerpc-e300c3-linux-gcc-4.0.2: command not found
configure:3561: $? = 127
configure:3581: checking whether the C compiler works
configure:3603: powerpc-e300c3-linux-gcc-4.0.2 conftest.c >&5
./configure: line 1: powerpc-e300c3-linux-gcc-4.0.2: command not found
configure:3607: $? = 127
configure:3645: result: no
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME «Check»
| #define PACKAGE_TARNAME «check»
| #define PACKAGE_VERSION «0.10.0»
| #define PACKAGE_STRING «Check 0.10.0″
| #define PACKAGE_BUGREPORT «check-devel at lists dot sourceforge dot net»
| #define PACKAGE_URL «»
| #define PACKAGE «check»
| #define VERSION «0.10.0»
| /* end confdefs.h. */
|
| int
| main ()
| {
|
| ;
| return 0;
| }
configure:3650: error: in
/home/mc_build/sources/check-0.10.0':
config.log’ for more detailsconfigure:3652: error: C compiler cannot create executables
See
## —————- ##
## Cache variables. ##
## —————- ##
ac_cv_env_AWK_PATH_set=
ac_cv_env_AWK_PATH_value=
ac_cv_env_CC_set=set
ac_cv_env_CC_value=powerpc-e300c3-linux-gcc-4.0.2
ac_cv_env_CFLAGS_set=
ac_cv_env_CFLAGS_value=
ac_cv_env_CPPFLAGS_set=
ac_cv_env_CPPFLAGS_value=
ac_cv_env_CPP_set=
ac_cv_env_CPP_value=
ac_cv_env_LDFLAGS_set=
ac_cv_env_LDFLAGS_value=
ac_cv_env_LIBSUBUNIT_CFLAGS_set=
ac_cv_env_LIBSUBUNIT_CFLAGS_value=
ac_cv_env_LIBSUBUNIT_LIBS_set=
ac_cv_env_LIBSUBUNIT_LIBS_value=
ac_cv_env_LIBS_set=
ac_cv_env_LIBS_value=
ac_cv_env_PKG_CONFIG_LIBDIR_set=
ac_cv_env_PKG_CONFIG_LIBDIR_value=
ac_cv_env_PKG_CONFIG_PATH_set=
ac_cv_env_PKG_CONFIG_PATH_value=
ac_cv_env_PKG_CONFIG_set=
ac_cv_env_PKG_CONFIG_value=
ac_cv_env_build_alias_set=
ac_cv_env_build_alias_value=
ac_cv_env_host_alias_set=set
ac_cv_env_host_alias_value=powerpc-e300c3-linux
ac_cv_env_target_alias_set=
ac_cv_env_target_alias_value=
ac_cv_path_install=’/usr/bin/install -c’
ac_cv_path_mkdir=/bin/mkdir
ac_cv_prog_AWK=gawk
ac_cv_prog_CC=powerpc-e300c3-linux-gcc-4.0.2
ac_cv_prog_ac_ct_STRIP=strip
ac_cv_prog_make_make_set=yes
## —————— ##
## Output variables. ##
## —————— ##
ACLOCAL=’${SHELL} /home/mc_build/sources/check-0.10.0/build-aux/missing —run aclocal-1.11′
AMDEPBACKSLASH=’\’
AMDEP_FALSE=’#’
AMDEP_TRUE=»
AMTAR=’$${TAR-tar}’
AM_BACKSLASH=»
AM_DEFAULT_V=»
AM_DEFAULT_VERBOSITY=»
AM_V=»
AR=»
AUTOCONF=’${SHELL} /home/mc_build/sources/check-0.10.0/build-aux/missing —run autoconf’
AUTOHEADER=’${SHELL} /home/mc_build/sources/check-0.10.0/build-aux/missing —run autoheader’
AUTOMAKE=’${SHELL} /home/mc_build/sources/check-0.10.0/build-aux/missing —run automake-1.11′
AWK=’gawk’
AWK_GSUB_DBL_BSLASH=»
AWK_PATH=»
CC=’powerpc-e300c3-linux-gcc-4.0.2′
CCDEPMODE=»
CFLAGS=»
CHECK_MAJOR_VERSION=’0′
CHECK_MICRO_VERSION=’0′
CHECK_MINOR_VERSION=’10’
CHECK_VERSION=’0.10.0′
CPP=»
CPPFLAGS=»
CYGPATH_W=’echo’
DEFS=»
DEPDIR=’.deps’
DLLTOOL=»
DSYMUTIL=»
DUMPBIN=»
ECHO_C=»
ECHO_N=’-n’
ECHO_T=»
EGREP=»
ENABLE_GCOV_FALSE=»
ENABLE_GCOV_TRUE=»
ENABLE_SUBUNIT=»
EXEEXT=»
FGREP=»
GCOV=»
GCOV_CFLAGS=»
GCOV_LIBS=»
GENHTML=»
GREP=»
HAVE_FORK=»
INSTALL_CHECKMK_FALSE=»
INSTALL_CHECKMK_TRUE=»
INSTALL_DATA=’${INSTALL} -m 644′
INSTALL_PROGRAM=’${INSTALL}’
INSTALL_SCRIPT=’${INSTALL}’
INSTALL_STRIP_PROGRAM=’$(install_sh) -c -s’
LCOV=»
LD=»
LDFLAGS=»
LIBOBJS=»
LIBS=»
LIBSUBUNIT_CFLAGS=»
LIBSUBUNIT_LIBS=»
LIBSUBUNIT_PC=»
LIBTOOL=»
LIPO=»
LN_S=»
LTLIBOBJS=»
MAKEINFO=’${SHELL} /home/mc_build/sources/check-0.10.0/build-aux/missing —run makeinfo’
MANIFEST_TOOL=»
MKDIR_P=’/bin/mkdir -p’
NM=»
NMEDIT=»
NO_TIMEOUT_TESTS_FALSE=»
NO_TIMEOUT_TESTS_TRUE=»
OBJDUMP=»
OBJEXT=»
OTOOL64=»
OTOOL=»
PACKAGE=’check’
PACKAGE_BUGREPORT=’check-devel at lists dot sourceforge dot net’
PACKAGE_NAME=’Check’
PACKAGE_STRING=’Check 0.10.0′
PACKAGE_TARNAME=’check’
PACKAGE_URL=»
PACKAGE_VERSION=’0.10.0′
PATH_SEPARATOR=':’
PKG_CONFIG=»
PKG_CONFIG_LIBDIR=»
PKG_CONFIG_PATH=»
PTHREAD_CC=»
PTHREAD_CFLAGS=»
PTHREAD_LIBS=»
RANLIB=»
SED=»
SET_MAKE=»
SHELL=’/bin/sh’
STRIP=’strip’
SUBUNIT_FALSE=»
SUBUNIT_TRUE=»
TEX=»
VERSION=’0.10.0′
ac_ct_AR=»
ac_ct_CC=»
ac_ct_DUMPBIN=»
acx_pthread_config=»
am__EXEEXT_FALSE=»
am__EXEEXT_TRUE=»
am__fastdepCC_FALSE=»
am__fastdepCC_TRUE=»
am__include=’include’
am__isrc=»
am__leading_dot=’.’
am__nodep=’_no’
am__quote=»
am__tar=’$${TAR-tar} chof — «$$tardir»‘
am__untar=’$${TAR-tar} xf -‘
bindir=’${exec_prefix}/bin’
build=»
build_alias=»
build_cpu=»
build_os=»
build_vendor=»
datadir=’${datarootdir}’
datarootdir=’${prefix}/share’
docdir=’${datarootdir}/doc/${PACKAGE_TARNAME}’
dvidir=’${docdir}’
exec_prefix=’NONE’
host=’powerpc-e300c3-linux’
host_alias=’powerpc-e300c3-linux’
host_cpu=»
host_os=»
host_vendor=»
htmldir=’${docdir}’
includedir=’${prefix}/include’
infodir=’${datarootdir}/info’
install_sh=’${SHELL} /home/mc_build/sources/check-0.10.0/build-aux/install-sh’
libdir=’${exec_prefix}/lib’
libexecdir=’${exec_prefix}/libexec’
localedir=’${datarootdir}/locale’
localstatedir=’${prefix}/var’
mandir=’${datarootdir}/man’
mkdir_p=’/bin/mkdir -p’
oldincludedir=’/usr/include’
pdfdir=’${docdir}’
prefix=’/home/mc_builds/build_check-0.10.0′
program_transform_name=’s,x,x,’
psdir=’${docdir}’
sbindir=’${exec_prefix}/sbin’
sharedstatedir=’${prefix}/com’
sysconfdir=’${prefix}/etc’
target_alias=»
## ———— ##
## confdefs.h. ##
## ———— ##
/* confdefs.h */
#define PACKAGE_NAME «Check»
#define PACKAGE_TARNAME «check»
#define PACKAGE_VERSION «0.10.0»
#define PACKAGE_STRING «Check 0.10.0″
#define PACKAGE_BUGREPORT «check-devel at lists dot sourceforge dot net»
#define PACKAGE_URL «»
#define PACKAGE «check»
#define VERSION «0.10.0»
configure: exit 77
Все. Извините. Вопрос снят. PATH на компилятор был не правильно прописан
А какая libglib2.0-dev компилируется без проблем?
У меня ошибка glib-compile-schemas in you PATH
Скачивал отсюда https://packages.ubuntu.com/trusty/libglib2.0-dev
ошибка та же.
PATH прописывал разные, не помогает.
В статье я оставил ссылку на архив с исходниками всех библиотек, которые я использовал для компиляции mc под ARM. Вот ссылка: http://tetraquark.ru/wp-content/uploads/2015/08/mc_src.tar.gz . Попробуйте данный набор библиотек.
Извините это снова я.
Мучаюсь который день
Естественно файлы я скачал все с Вашего архива. glib-2.44.1
Испробовал уже Red Hat, Debian, Ubuntu, сейчас пытаюсь компилировать на Fedora
Все архивы кроме glib и mc компилируются. При компиляции glib (из Вашего пакета) ошибка glib-genmarshal
Где его взять этого маршала?
сумасшедший
Скачал отсюда http://ftp.gnome.org/pub/gnome/sources/glib/2.16/
glib-2.16.6 он тоже требует маршала.
В статье указано, что могут быть проблемы с данной утилитой. Возможное решение — попробуйте установить следующий пакет (для ubuntu\debian):
# sudo apt-get install libglib2.0-dev
компиляция ncurses заканчивается ошибкой:
In file included from ../ncurses/curses.priv.h:283:0,
from ../ncurses/lib_gen.c:19:
_3498.c:835:15: error: expected ‘)’ before ‘int’
../include/curses.h:1594:56: note: in definition of macro ‘mouse_trafo’
#define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)
^
Makefile:785: ошибка выполнения рецепта для цели «../objects/lib_gen.o»
make[1]: *** [../objects/lib_gen.o] Ошибка 1
make[1]: выход из каталога «/home/valentin/Main_Folder/Mine/Si/CrossCompile/ncurses-5.9/ncurses»
Makefile:109: ошибка выполнения рецепта для цели «install»
make: *** [install] Ошибка 2
что делать?
похоже дело в ubuntu 16