9

我正在交叉编译一个应用程序,但链接会因错误而爆炸

“找不到 /lib/libc.so.6”。

它应该使用的 libc.so.6 是位于/home/work/worldcom/filesys/lib/libc.so.6. 我在这里做错了什么?

linking libobj.so
arm-none-linux-gnueabi-g++ obj1.o obj2.o obj2.o  -o libobj.so -L/home/work/worldcom/filesys/usr -Wl,-O1 -Wl,-z,defs -Wl,--enable-new-dtags -Wl,--sort-common -Wl,--as-needed -Wl,--hash-style=both -L/home/work/worldcom/filesys -L/home/work/worldcom/filesys/lib -L/home/work/worldcom/filesys/usr/lib -lcurl -shared
/home/lishevita/armv5tel/arm-2009q3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: skipping incompatible /lib/libc.so.6 when searching for /lib/libc.so.6
/home/lishevita/armv5tel/arm-2009q3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find /lib/libc.so.6
collect2: ld returned 1 exit status<br />
make: *** [libobj.so] Error 1<br />

我的 makefile 是手写的(即不是由Autotools生成的)。为了避免笼统地“你的 Makefile 坏了”,这里有一些来自 makefile 的细节可能有助于澄清。

CROSS_COMPILE = arm-none-linux-gnueabi-  
SYSROOT = /home/work/worldcom/filesys/  
DESTDIR = /home/work/worldcom/filesys/  

RELEASE_CXXFLAGS = -Os  
DEBUG_CXXFLAGS = -O0 -gstabs  
PKGCONFIG=`env ROOT=/home/work/worldcom/filesys cross-pkg-config glib-2.0 libcurl --cflags`  

CC = $(CROSS_COMPILE)gcc  
CXX = $(CROSS_COMPILE)g++  
LD = $(CROSS_COMPILE)ld  
AR = $(CROSS_COMPILE)ar  

LDFLAGS = -Wl,-O1 -Wl,-z,defs -Wl,--enable-new-dtags -Wl,--sort-common -Wl,--as-needed -Wl,--hash-style=both -L$(SYSROOT) -L$(SYSROOT)lib -L$(SYSROOT)usr -L$(SYSROOT)usr/lib -lcurl  

libobj.so: $(LIBOBJ_OBJS)  
        @echo linking $@  
        $(CXX) $^ -o $@ $(LDFLAGS) -shared $(PKG_LIBS) 

当然,LIBOBJ_OBJS 也有定义和目标,但这些与问题无关。

4

4 回答 4

14

您没有说明您使用的是什么 gcc 版本,但如果它是一个足够新的版本(我认为 4.0.0 及以上),您应该尝试将--sysroot标志添加到 g++/ld。将其指向 Makefile 中定义的 $SYSROOT。例如:

--sysroot=$(SYSROOT)

假设最近的 gcc 版本足够,它将起作用。

于 2009-12-27T20:43:08.387 回答
1

我刚刚经历了同样的问题;添加 --sysroot=/rootfs/prefix 帮助我更接近真正的问题。我通过在目标中安装包 libstdc++-dev 来修复它。

于 2012-11-23T09:30:45.747 回答
0

您是否没有考虑过可能LIBPATH设置并硬编码以查找/lib/libc.so.6路径/lib

make在交叉编译时发出之前,您是否尝试过在命令行上设置这样的环境变量:

LIBPATH=/home/work/worldcom/filesys/lib

/lib在您的特定情况下,正如您在标签“交叉编译”中提到的那样,删除任何引用以完全强制链接器查看您自己的主目录而不是干扰交叉编译可能是值得的过程。

另一种可能性是 gcc 编译器在为您的环境构建时,从源代码构建编译器期间的配置被指定为指向/lib路径。

希望这会有所帮助,最好的问候,汤姆。

于 2009-12-27T02:34:12.223 回答
-3

似乎 makefile 已损坏,因为假定 libc.so.6 位于 /lib/ 文件夹中(注意前面的斜杠表示绝对路径!)。这似乎是问题所在。

于 2009-12-27T02:00:39.013 回答