2011-08-27 65 views
2

嗨我想安裝zlib的新版本,我沒有root權限,所以我只是在本地安裝它。系統安裝是1.2.3,我試圖用1.2.5鏈接「本地」版本的庫

我編譯像

g++ -g myProg.cpp myOs.o -lpthread -IzlibInc/ -LzlibLib/ -lz -o myProg 

使用LDD它說

ldd myProg 
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c15800000) 
libz.so.1 => /usr/lib64/libz.so.1 (0x0000003c15c00000) 
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003c17400000) 
libm.so.6 => /lib64/libm.so.6 (0x0000003c15400000) 
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003c17000000) 
libc.so.6 => /lib64/libc.so.6 (0x0000003c14c00000) 
/lib64/ld-linux-x86-64.so.2 (0x0000003c14800000) 

所以正確犯規鏈接。

感謝

///////////////////////////////////////////// 

更新

我有2個文件夾叫zlibInc和zlibLib containint頭和共享對象文件。

ls zlibLib/ 
libz.a libz.so libz.so.1 libz.so.1.2.5 pkgconfig 
ls zlibInc/ 
zconf.h zlib.h 

我的源代碼是

cat zlibTest.cpp 
#include <cstdio> 
#include <zlib.h> 

int main(){ 
    fprintf(stderr,"%s\n",ZLIB_VERSION); 
    int *a=new int[10]; 

    gzread(stdin,a,5); 
    return 0; 
} 

而且我的編譯命令行是

g++ zlibTest.cpp -I zlibInc/ -L zlibLib/ -L . -I . -lz;ldd a.out 
libz.so.1 => /usr/lib64/libz.so.1 (0x0000003c15c00000) 
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003c17400000) 
libm.so.6 => /lib64/libm.so.6 (0x0000003c15400000) 
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003c17000000) 
libc.so.6 => /lib64/libc.so.6 (0x0000003c14c00000) 
/lib64/ld-linux-x86-64.so.2 (0x0000003c14800000) 
+0

如果你先放入'-lz',該怎麼辦?另外,你可以說'-pthread'作爲編譯選項,所以你不必手動鏈接。 –

回答

5

它正確地做鏈接。本地zlib和全系統zlib具有相同的SONAME,並且運行時鏈接程序不知道您的本地版本。您可以在連接器(-Wl,-rpath=./zlibLib)上提供-rpath選項,或者在運行時設置LD_LIBRARY_PATH環境變量(LD_LIBRARY_PATH=./zlibLib:$LD_LIBRARY_PATH ./myProg)。

+0

通常不建議將'-rpath'設置爲相對路徑:根據是否在具有'。/ zlibLib /'子目錄的目錄中執行它,程序的運行方式會有所不同。我建議使用'-rpath = $ {PWD}/zlibLib'來代替。 –