Сбой GNAT GPL Ada приведет к ошибке компоновки при кросс-компиляции для Raspberry pi

Я пытаюсь создать простое приложение «hello_there» Ada для работы на машине Raspberry Pi 2/Raspbian, но столкнулся с проблемой привязки.

До сих пор я сделал следующее и имел следующие проблемы:

  1. Загружен набор инструментов «Raspberry Pi 2 Linux» GNAT GPL Ada для кросс-компиляции (linux-on-linux) на хост-компьютере (Ubuntu 16.04)

  2. Успешно запустил "doinstall" на хост-компьютере.

  3. Создал простой файл «hello_there.adb», который просто выводит сообщение на консоль.

  4. Запустите {INSTALL_ROOT}/gnat-gpl-2016-raspberrypi-linux-linux-bin/bin/arm-linux-gnueabihf-gnatmake -v hello_there.adb, чтобы создать это небольшое приложение.

  5. Тот жаловался, что crt1.o | crti.o | Файлы кртн.о не могут быть найдены, и поскольку я не мог использовать файлы под /usr/lib/x86_64-linux-gnu/ на хост-компьютере (как я предполагаю, их можно использовать только для цели x86), единственное решение, которое я смог найти, - это скопировать эти файлы с целевой машины. которые расположены под /usr/lib/arm-linux-gnueabihf в каталоге команд gnatmake. Это остановило компоновщика, жалующегося на это.

  6. Снова запустил {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 и пытаюсь понять это.

Любые указатели, высоко ценятся.

Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде чем использовать эту конкретную версию (кросс-)компилятора 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 (the RPI 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 «индексы сообщества не найдены» или что-то в этом роде, поэтому я сдался :)

Sidisyom 22.03.2022 20:56

Другие вопросы по теме