3

我正在尝试为带有运行 uClinux 的 ARM 处理器的嵌入式系统编译“hello world”C 应用程序。我正在使用这个工具链

当我使用 -static 编译标志编译 C 应用程序时,应用程序工作正常。当我删除 -static 标志时 - 我收到一个错误:can't load library 'libc.so.6'

目标上不存在 libc.so.6,进入目标设备上的 /lib 文件夹,符号链接 libc.so.0 指向 libuClibc-0.9.33.2.so

我如何“告诉”编译器与 libc.so.0 链接?

4

3 回答 3

2

似乎您使用的工具链是为 glibc 构建的。但是目标板已经安装了uClibc。
这两个库不兼容。
在运行时它们是不兼容的,在编译时它们是不兼容的。
您不能“告诉编译器使用不同且不兼容的库。
您需要获取专门为 uClibc 而不是 glibc/eglibc 构建的工具链。

网站 gnuarm.com 曾经有一些可靠的工具链,但该网站已不复存在。

您可以尝试使用crosstool-NG构建自己的工具链,这比构建单个工具链包要容易得多。尝试arm-unknown-linux-uclibcgnueabi配置并根据您的需要对其进行自定义。

于 2014-04-18T09:21:03.160 回答
2

在将一个简单的 helloworld 从 openwrt 工具链(使用 uClibc,目标 IPQ4028)交叉编译到我的路由器 Gl-iNet-B1300 时,我遇到了类似的问题。编译成功后,我将文件 scp 到路由器,并在尝试执行此错误时出现:

    root@GL-B1300:~# ./helloworld
    /root/helloworld: can't load library 'libc.so.0'

当我运行 'ls -la | grep libc.so。在 /lib/ 上,出现了这样的问题:

    libc.so.1 -> libuClibc-1.0.14.so

所以由于 libc.so.0 不存在,我只是在 /lib/ 中创建了一个链接

    lib/# ln -s libc.so.1 libc.so.0

再次运行 'ls -la | grep libc.so.':

    libc.so.0 -> libc.so.1
    libc.so.1 -> libuClibc-1.0.14.so

然后,执行文件:

    root@GL-B1300:~# ./helloworld
    Hell! O' world, why won't my code compile?
    The value of pi is 3.141593

我想这里真正的问题是我使用的工具链不是路由器固件的正确工具链。

于 2018-04-09T12:30:21.600 回答
-1

如果删除 -I,则应在代码中添加代码“load XXX.lib”。您可以在 Google 中找到静态链接和动态链接之间的一些差异。

于 2014-04-18T09:32:07.380 回答