Я пытаюсь создать простое приложение «hello_there» Ada для работы на машине Raspberry Pi 2/Raspbian, но столкнулся с проблемой привязки.
До сих пор я сделал следующее и имел следующие проблемы:
Загружен набор инструментов «Raspberry Pi 2 Linux» GNAT GPL Ada для кросс-компиляции (linux-on-linux) на хост-компьютере (Ubuntu 16.04)
Успешно запустил "doinstall" на хост-компьютере.
Создал простой файл «hello_there.adb», который просто выводит сообщение на консоль.
Запустите {INSTALL_ROOT}/gnat-gpl-2016-raspberrypi-linux-linux-bin/bin/arm-linux-gnueabihf-gnatmake -v hello_there.adb, чтобы создать это небольшое приложение.
Тот жаловался, что crt1.o | crti.o | Файлы кртн.о не могут быть найдены, и поскольку я не мог использовать файлы под /usr/lib/x86_64-linux-gnu/ на хост-компьютере (как я предполагаю, их можно использовать только для цели x86), единственное решение, которое я смог найти, - это скопировать эти файлы с целевой машины. которые расположены под /usr/lib/arm-linux-gnueabihf в каталоге команд gnatmake. Это остановило компоновщика, жалующегося на это.
Снова запустил {INSTALL_ROOT}/gnat-gpl-2016-raspberrypi-linux-linux-bin/bin/arm-linux-gnueabihf-gnatmake -v hello_there.adb, но теперь компоновщик жалуется на следующую ошибку:
{INSTALL_ROOT}/gnat-gpl-2016-raspberrypi-linux-linux-bin/bin/../libexec/gcc/arm-linux-gnueabihf/4.9.4/ld: не могу найти -lc
Похоже, что компиляция и связывание завершены нормально, но связывание не выполняется. Полный вывод следующий:
GNATMAKE GPL 2016 (20160515-49)
Copyright (C) 1992-2016, Free Software Foundation, Inc.
"hello_there.ali" being checked ...
-> "hello_there.ali" missing.
arm-linux-gnueabihf-gcc -c hello_there.adb
End of compilation
arm-linux-gnueabihf-gnatbind -x hello_there.ali
arm-linux-gnueabihf-gnatlink hello_there.ali
/home/savvas/opt/GNAT/gnat-gpl-2016-raspberrypi-linux-linux-bin/bin/../libexec/gcc/arm-linux-gnueabihf/4.9.4/ld: cannot find -lc
collect2: error: ld returned 1 exit status
arm-linux-gnueabihf-gnatlink: error when calling /home/savvas/opt/GNAT/gnat-gpl-2016-raspberrypi-linux-linux-bin/bin/arm-linux-gnueabihf-gcc
arm-linux-gnueabihf-gnatmake: *** link failed.
Компоновщик ищет файл взбираться (или файл с другим именем?) где-то в пути к библиотеке или происходит что-то еще? Я новичок в компиляции/связывании gcc и пытаюсь понять это.
Любые указатели, высоко ценятся.
Спасибо
Прежде чем использовать эту конкретную версию (кросс-)компилятора GNAT, вам необходимо сначала скопировать некоторые дополнительные файлы с вашего RPi 2 на хост. Точные шаги объясняются в файле ПРОЧТИ МЕНЯ, который сопровождает конкретный выпуск GNAT. Я скопировал соответствующий раздел в конец этого ответа для удобства.
Тем не менее, также рассмотрите возможность разработки своей программы на Ubuntu, сначала используя более новую версию GNAT (Издание сообщества или версия ФСФ), затем скопируйте исходный код Raspberry Pi и перекомпилируйте его на самом Pi. Компилятор GNAT FSF (и связанные с ним инструменты), доступный в репозиториях Debian, также доступен в ОС Raspberry Pi:
$ sudo apt install gnat gprbuild
Наконец, вы также можете использовать Алире (по крайней мере, на хосте). У Alire пока нет официальной поддержки Raspberry Pi, но уже доступен экспериментальный релиз здесь.
Выдержка из файла README:
Raspberrypi 2 (hosted on Linux)
The GNAT GPL compiler for raspberrypi is a cross compiler, hosted on linux-x86 (or linux-x86_64). You need to copy from the boards some library files. The following script achieves that. It should be executed from
<GNAT GPL>/arm-linux-gnueabihf
(theRPI
variable is login@target):#!/bin/sh RPI=pi@myboard mkdir sysroot sysroot/lib sysroot/lib/arm-linux-gnueabihf cd sysroot/lib rsync -a $RPI:/lib/arm-linux-gnueabihf/{ld-*,lib?.*,lib?-*,libpthread*,librt*} arm-linux-gnueabihf ln -s arm-linux-gnueabihf/lib?.* . cd ../.. mkdir sysroot/usr sysroot/usr/lib sysroot/usr/lib/arm-linux-gnueabihf cd sysroot/usr/lib/arm-linux-gnueabihf rsync -a $RPI:/usr/lib/arm-linux-gnueabihf {crt*,libc.*,libc_no*,libpthread*} . ln -s ../../../lib/arm-linux-gnueabihf/libm.so.* libm.so ln -s ../../../lib/arm-linux-gnueabihf/librt.so.* librt.so cd .. ln -s arm-linux-gnueabihf/* .
Before running a GNAT GPL tool, set
ENV_PREFIX
variable like this:export ENV_PREFIX=<GNAT GPL>/arm-linux-gnueabihf/sysroot
Предложение № 1 сработало как шарм, спасибо! (небольшая опечатка во второй команде rsync, так как она не работает из-за отсутствия «/»). Честно говоря, я не уверен, что на самом деле получил это в моем локальном каталоге <GNAT GPL>, так как поиск чего-то вроде «RPI =» не не вернуть никаких результатов. Может я какую-то другую версию скачал? Попробую предложение № 2, а также разработку в GNAT Studio и компиляцию на цели, безусловно, звучит более просто. Alire был первым, что я попробовал, но он выдавал какую-то странную ошибку git «индексы сообщества не найдены» или что-то в этом роде, поэтому я сдался :)