我试图编译"你好世界"用于运行uClinux的ARM处理器的嵌入式系统的C应用程序。 我正在使用此toolchain
当我使用-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链接?
答案 0 :(得分:2)
看起来像你正在使用的工具链是为glibc而构建的。但目标板上安装了uClibc 这两个库是不兼容的 在运行时它们是不兼容的,并且在编译时它们是不兼容的 你不能告诉编译器使用不同的&不兼容的图书馆 您需要获得专门为uClibc而不是glibc / eglibc构建的工具链。
网站gnuarm.com曾经拥有一些可靠的工具链,但该网站已不复存在。
您可以尝试使用crosstool-NG构建自己的工具链,这比构建单个工具链包要容易得多。尝试arm-unknown-linux-uclibcgnueabi
配置并根据您的需要进行自定义。
答案 1 :(得分:1)
当从openwrt工具链(使用uClibc,目标IPQ4028)到我的路由器Gl-iNet-B1300交叉编译一个简单的helloworld时,我遇到了类似的问题。 编译成功后,我将文件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
我想这里真正的问题是我使用的工具链不适合路由器固件。
答案 2 :(得分:-1)
如果删除-I,则应在代码中添加代码“load XXX.lib”。 您可以在Google中找到静态和动态链接之间的一些差异。