我正在交叉编译一个应用程序,但链接会爆发,并且会出现错误
“找不到/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的定义和目标,但这些与问题无关。
答案 0 :(得分:11)
你没有说明你正在使用的gcc版本,但是如果它是最近的版本(4.0.0及以上我认为)你应该尝试使用-sysroot标志来g ++ / ld。将其指向Makefile中定义的$ SYSROOT。
假设最近有足够的gcc版本,它会起作用。
希望这有帮助, 吉拉德
答案 1 :(得分:1)
我刚刚经历了同样的问题;添加--sysroot = / rootfs / prefix帮助我更接近真正的问题。 我通过在目标中安装libstdc ++ - dev来解决这个问题。
答案 2 :(得分:0)
您是否认为可能LIBPATH
设置并硬编码以查找/lib/libc.so.6
因此/lib
路径?
在交叉编译时发出make
之前,您是否尝试在命令行上设置这样的环境变量:
LIBPATH=/home/work/worldcom/filesys/lib
在您的特定情况下,正如您在标记“交叉编译”中所提到的,删除对/lib
的任何引用可能是值得的,以完全强制链接器查找您自己的主目录,而不是不要干扰交叉编译过程。
另一种可能性是gcc编译器在为您的环境构建时,从源代码构建编译器期间的配置被指定为指向/lib
路径。
希望这有帮助, 最好的祝福, 汤姆。
答案 3 :(得分:-3)
似乎makefile被破坏了,因为假设libc.so.6位于/ lib /文件夹中(注意前面的斜杠表示绝对路径!)。这似乎是个问题。