2014-05-22 104 views
1

我有一個內部版本,我希望鏈接並加載特定版本的庫,並在系統上安裝同一庫的不同版本。我正在使用-L選項來指向我想鏈接的版本,但gcc似乎仍然選擇已安裝的版本。有沒有辦法強制gcc在搜索標準位置之前搜索-L選項指定的目錄?gcc更改庫的搜索順序

我使用gcc 4.4.7運行Centos 6.5。這裏有沒有安裝 的zlib-devel的相關庫和目錄

/lib64/libz.so.1.2.3 
/lib64/libz.so.1 -> libz.so.1.2.3 

/home/richj/product/zlib/lib/libz.so.1.2.8 
/home/richj/product/zlib/lib/libz.so -> libz.so.1.2.8 
/home/richj/product/zlib/lib/libz.so.1 -> libz.so.1.2.8 
/home/richj/product/zlib/include/zlib.h 

/home/richj/product/foo/libfoo.so 
/home/richj/product/foo/foo.h 

/home/richj/product/bar/bar.c 

在bar.c主要在libfoo.so調用foo和Foo在libz進行 調用inflateInit這裏是libfoo.so和酒吧編譯命令。程序庫和 程序都可以編譯並運行,不會出錯。

/usr/bin/gcc -c -fPIC -Wall -g -I../zlib/include foo.c 
/usr/bin/gcc -shared -o libfoo.so foo.o 

/usr/bin/gcc -Wall -g -I../foo -L../foo -lfoo -L../zlib/lib -lz bar.c bar 

$ldd bar 
    linux-vdso.so.1 => (0x00007fffd67ff000) 
    libfoo.so => ../foo/libfoo.so 
    libz.so.1 => /lib64/libz.so.1 
    libc.so.6 => /lib64/libc.so.6 
    /lib64/ld-linux-x86-64.so.2 

所以問題是爲什麼它不鏈接和加載我指向編譯命令中的zlib版本?

+2

編譯失敗還是在運行時失敗?僅僅因爲gcc使用正確的庫鏈接並不能確保在程序運行時使用正確的庫。請提供您正在運行的操作系統和版本的詳細信息。 –

+0

編譯鏈接對'libz.so.1.2.8',但運行時加載程序沒有被告知看看那裏,所以它找到標準庫。要麼設置LD_LIBRARY_PATH,要麼修改'/etc/ld.so.conf',或者使用pass-through選項(可能是'-Wl,rpath = $ HOME/product/zlib/lib ')使可執行文件首先在正確的位置查找。 –

回答

2

向gcc傳遞-L/path/to/libs可以幫助編譯器知道在哪裏尋找。除非您要求,否則此信息不會被編入輸出。否則,二進制文件可能只能在編譯的系統上運行。

您需要做的就是將-Wl,rpath,/path/to/library添加到鏈接命令。這將在程序中設置rpath,這樣當共享庫加載程序開始查找所需的庫時,它將知道還有一個額外的位置。另外,如果此位置是安裝庫的位置,並且希望許多程序可以使用,則還可以在/etc/ld.so.conf.d中添加一個文件,該文件只包含包含這些庫的目錄的完整路徑。這將允許所有使用共享庫加載器的程序工作,而無需在每個程序中嵌入rpath。