2009-12-27 59 views
4

我交叉編譯的應用程序,但鏈接的打擊了一個錯誤,它找不到/lib/libc.so.6

「找不到/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 [email protected] 
     $(CXX) $^ -o [email protected] $(LDFLAGS) -shared $(PKG_LIBS) 

當然,還有一個LIBOBJ_OBJS的定義和目標,但這些與問題無關。

+0

你應該看看gcc -dumpspecs的輸出 - 它可能在那裏搜索libc。 – 2009-12-27 20:52:47

回答

8

你沒有指出你正在使用的gcc版本,但如果它是最近的一個(4.0.0及以上我認爲),你應該嘗試-sysroot標誌g ++/ld。按照Makefile中的定義將它指向$ SYSROOT。

假設最近有足夠的gcc版本,它將工作。

希望這有助於 吉拉德

+0

我的英雄! :) 它實際上--sroot沒有「with-」,但你指出我在正確的方向,它的工作原理。現在我有一個新的錯誤。新錯誤很好。這意味着我通過了一個問題,並有一個全新的挑戰來誘發高血壓! :) 下面是我的Makefile中的新行: $(CXX)$^-o $ @ $(LDFLAGS)-shared $(PKG_LIBS)--sysroot = $(SYSROOT) – lishevita 2009-12-27 21:13:03

-3

看起來makefile壞了,因爲libc.so.6被假定位於/ lib /文件夾中(注意前面的斜槓表示絕對路徑!)。這似乎是問題。

+0

當然,但是makefile中的內容可能被破壞?你可以從我粘貼的內容中看到鏈接的內容,對吧?所有這些-L都指向顯然不是/的地方。 Soooo ...還有一些我錯過的東西。 我會在我的問題中添加更多信息,看看是否有助於澄清任何... – lishevita 2009-12-27 02:28:06

+0

好吧,我想我在這裏不夠清楚.. :-)。像/ foo/bar和foo/bar之類的路徑名稱之間存在巨大差異。第一個總是指向/ foo/bar /,從文件系統的根目錄可以看出,後者取決於當前的工作目錄。由於makefile中的路徑似乎是絕對路徑,即從根目錄開始,所以甚至不會查找搜索路徑並搜索libc.so。希望有所幫助。 – moritz 2009-12-27 15:06:23

+0

這不是makefile文件壞了,絕對路徑包含在鏈接器腳本中。這不一定是錯誤的,因爲交叉編譯鏈接器應該在sysroot前綴下搜索......但它確實會造成非常混亂的錯誤消息。 – 2013-05-08 16:48:48

0

你有沒有考慮過可能LIBPATH已設置並硬編碼尋找/lib/libc.so.6,因此/lib路徑?

您是否嘗試過設置環境變量像這樣在命令行上,發出make之前,當交叉編譯:

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

在您的特定情況下,如你在標籤中所提到的「跨編譯',可能值得去除對/lib的任何引用,以便完全強制鏈接器查看自己的主目錄,而不是干涉交叉編譯過程。

另一種可能性是,gcc編譯器在爲您的環境構建時(即從源代碼構建編譯器期間的配置)指定爲指向/lib路徑。

希望這會有所幫助, 最好的問候, 湯姆。

+0

剛剛試過 export LIBPATH=/home/work/worldcom/filesys/lib 並沒有得到任何喜悅。也許你說的正在編譯的gcc編譯器指向/ lib路徑,雖然這看起來很奇怪。我會將其視爲問題的可能來源。 謝謝,麗莎 – lishevita 2009-12-27 02:45:46

1

我剛剛經歷了同樣的問題去了;添加--sysroot =/rootfs/prefix使我更接近真正的問題。 我通過在target中安裝libstdC++ - dev來修復它。

相關問題