Raspberry pi 交叉编译时 GNAT GPL Ada 失败将链接错误

GNAT GPL Ada fails will linkage error when cross-compiling for the Raspberry pi

我正在尝试在 Raspberry Pi 2/Raspbian 机器上为 运行 构建一个简单的“hello_there”Ada 应用程序,但遇到了链接问题。

到目前为止,我已经完成了以下工作并遇到了以下问题:

  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 | crtn.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.
    

链接器是否在库路径中的某处寻找 clib(或其他文件名?)文件,或者是否有其他情况发生?我是 gcc compilation/linking 的新手,正在尝试理解这一点。

任何指点,不胜感激。

谢谢

在使用此特定版本的 GNAT(交叉)编译器之前,您需要先将一些其他文件从 RPi 2 复制到主机。具体步骤在特定 GNAT 版本随附的 README 文件中进行了说明。为了方便起见,我将相关部分复制到此答案的末尾。

也就是说,也可以考虑先使用较新版本的 GNAT (Community Edition or an FSF version) 在 Ubuntu 上开发您的程序,然后将源代码复制到 Raspberry Pi,然后重新编译它在 Pi 本身上。可从 Debian 存储库获得的 GNAT FSF 编译器(和相关工具)也可在 Raspberry Pi OS:

上获得
$ sudo apt install gnat gprbuild

最后,你也可以考虑使用Alire (at least on the host). Alire has no official support for Raspberry Pi yet, but an experimental release is already available here


自述文件摘录:

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