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 应用程序,但遇到了链接问题。
到目前为止,我已经完成了以下工作并遇到了以下问题:
在主机上下载了“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 | crtn.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.
链接器是否在库路径中的某处寻找 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
我正在尝试在 Raspberry Pi 2/Raspbian 机器上为 运行 构建一个简单的“hello_there”Ada 应用程序,但遇到了链接问题。
到目前为止,我已经完成了以下工作并遇到了以下问题:
在主机上下载了“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 | crtn.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.
链接器是否在库路径中的某处寻找 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
(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