2012-09-04 14 views
0

我在交叉編譯與gstreamer相關的項目時遇到了極大的麻煩。我想鏈接到我的交叉編譯機器上的庫/usr/lib指定要在Automake中鏈接的精確庫

如果我做標準鏈接器標記-L{FILESYS_DIR}/usr/lib -lGLESv2我從我的交叉編譯工具鏈中得到pthread投訴。因此,我試圖鏈接到這個庫,而不使用-L標誌。

無論我做什麼,我得到undefined symbol glFramebuffer2D.然而,快速readelf -Wc $FILESYS_DIR/usr/lib/libGLESv2.so | glFrame顯示我glFramebuffer2D符號。

我拉我的頭髮,因爲不管我指定的autoconf什麼旗,除非我用的是-L -l方法叫做libtool的扔掉我的鏈接請求......

編輯:我有另外的想法,我嘗試了-Wl, $FILESYS_DIR/usr/lib/libGLESv2.so,它在編譯和鏈接過程中工作,但不在運行時期間......對我來說很明顯(現在),因爲主機根目錄是$ FILESYS_DIR。無論如何,這是正確的方法,但我想我需要相對名稱。


libtool: link: arm-none-linux-gnueabi-gcc -shared .libs/libgstbla_la-gstblaoverlay.o 
    .libs/libgstbla_la-gstblastabilize.o .libs/libgstbla_la-gles2_utilities.o -Wl,- 
    rpath -Wl,/home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib -Wl,-rpath - 
    Wl,/home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib -L/home/z3/z3- 
    netra/filesys/fs/opt/gstreamer/lib /home/z3/z3-netra/filesys/fs//opt/gstreamer- 
    0.4/lib/libgstbase-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer- 
    0.4/lib/libgstreamer-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer- 
    0.4/lib/libgstvideo-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer- 
    0.4/lib/libgobject-2.0.so /home/z3/z3-netra/filesys/fs//opt/gstreamer- 
    0.4/lib/libgmodule-2.0.so /home/z3/z3-netra/filesys/fs//opt/gstreamer- 
    0.4/lib/libgthread-2.0.so -lrt /home/z3/z3-netra/filesys/fs//opt/gstreamer- 
    0.4/lib/libglib-2.0.so -pthread -Wl,-soname -Wl,libgstbla.so -Wl,-version-script - 
    Wl,.libs/libgstbla.ver -o .libs/libgstbla.so 

如果需要的話,在一個行,以及:

libtool: link: arm-none-linux-gnueabi-gcc -shared .libs/libgstbla_la-gstblaoverlay.o .libs/libgstbla_la-gstblastabilize.o .libs/libgstbla_la-gles2_utilities.o -Wl,-rpath -Wl,/home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib -Wl,-rpath -Wl,/home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib -L/home/z3/z3-netra/filesys/fs/opt/gstreamer/lib /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgstbase-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgstreamer-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgstvideo-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgobject-2.0.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgmodule-2.0.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgthread-2.0.so -lrt /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libglib-2.0.so -pthread -Wl,-soname -Wl,libgstbla.so -Wl,-version-script -Wl,.libs/libgstbla.ver -o .libs/libgstbla.so 
+0

您可以使用'-Wl,-rpath'兩次,而無需實際設置運行時路徑。將它們設置爲目標系統上的有效庫路徑,並且希望它可以更好地工作。 –

+0

有趣的是,請注意,鏈接調用是由Automake爲我生成的。我會環顧四周,看看我能否解決這個具體問題。 – Constantin

+1

當你說「不管我指定給autoconf的標誌是什麼」,你指的是你指定給configure腳本的標誌嗎? –

回答

0

所有,這是涉及到以下問題:set global gcc default search paths

這裏的問題是關係到pthread.so(也glib.so)。 /usr/lib/pthread.so在很多系統上都是ASCII腳本,然後進一步鏈接到系統的/lib/pthread.so.0(這是一個軟鏈接)。編譯時,我的$(FILESYS_DIR)是正確的,但是libpthread.so指向主機系統pthread.so

我犯了一個巨大的錯誤,在正確的交叉編譯管理下很容易避免。在編譯目標系統時,請不要在目標系統文件系統上使用文件(如果它是我的NFS文件系統)。使用爲該目標系統編譯的本地庫。 FURTHERMORE,指定-Wl,-rpath-link=/[local location where your *.so reside]

編譯器/鏈接器標誌允許運行時路徑在編譯和鏈接期間在本地系統上,但在運行時期間保持標準運行時路徑....希望這是有道理的。

0

/usr/lib應當已經在庫搜索路徑上,所以你不應該需要指定RPATH。你需要做的是告訴你的(交叉)鏈接器在哪裏找到庫。我認爲這包括傳遞依賴關係,比如libpthread。你有$FILESYS_DIR/usr/lib/libpthread.so?它是否指向/lib/libpthread.so.N?哦,等等,我現在看到了一些我現在寫出來的東西:注意到(可能)缺少$FILESYS_DIR那麼:因爲$FILESYS_DIR/lib不在庫上,所以可能鏈接器正在尋找libGLESv2傳遞需要的libpthread,但沒有找到它包括路徑。將-L $FILESYS_DIR/lib添加到您的鏈接器標誌並重試。