2

按照本文中给出的说明,我成功地在我的 Ubuntu 12.04 主机上为 Raspberry Pi Board 交叉编译了一个简单的 hello-world.c 程序

http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler/

使用的交叉编译命令是 arm-linux-gnueabihf-gcc hello-world.c

我执行了在 Rasperry Pi 板上生成的 a.out,它显示了正确的输出。接下来我做了

ldd a.out

并得到以下结果

 > ldd a.out
   >>/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xbcfcb000)
  >>>libc.so.6 ==> /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e91000)
 >>>>/lib/ld-linux-armhf.so.3 (0xb6fd8000)**

现在,我无法在我的主机 Ubuntu 12.04 机器上找到文件 libcofi_rpi.so。所以我想知道 hello-world 程序最初是如何交叉编译的。如果我在主机 Ubuntu 12.04 机器上重命名 libc.so* 交叉编译器 arm 库,交叉编译将失败。所以我知道,交叉编译器肯定在寻找这些库。 那么在主机 Ubuntu 12.04 机器上没有 libcofi_rpi.so 库的情况下,交叉编译是如何成功的呢?

4

2 回答 2

1

针对共享库进行编译只需要头文件。链接将在运行时发生(ldd检查是否所有动态链接的库都可用而无需实际运行程序)。

如果您静态链接库(即,将其编译成最终的可执行文件),那么编译器会产生错误。

于 2014-10-29T09:46:03.707 回答
0

您可能有一个/etc/ld.so.preload包含上述/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so. 这是一个据称包含装配优化memcpymemmove功能的库。如果您的系统在指定位置没有此库但它工作正常,那么您可以安全地从文件中删除该行(或/etc/ld.so.preload完全删除整个文件,如果这是它包含的唯一行)。

于 2017-06-11T17:46:53.190 回答