我有一個內部版本,我希望鏈接並加載特定版本的庫,並在系統上安裝同一庫的不同版本。我正在使用-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版本?
編譯失敗還是在運行時失敗?僅僅因爲gcc使用正確的庫鏈接並不能確保在程序運行時使用正確的庫。請提供您正在運行的操作系統和版本的詳細信息。 –
編譯鏈接對'libz.so.1.2.8',但運行時加載程序沒有被告知看看那裏,所以它找到標準庫。要麼設置LD_LIBRARY_PATH,要麼修改'/etc/ld.so.conf',或者使用pass-through選項(可能是'-Wl,rpath = $ HOME/product/zlib/lib ')使可執行文件首先在正確的位置查找。 –