2014-01-09 73 views
6

我在我的計算機上構建我的程序,其中libtiff.so -> libtiff.so.5。 然後推動另一臺機器上的構建libtiff.so -> libtiff.so.4我如何鏈接到較舊版本的共享庫

在運行時,我的程序存在:«加載共享庫時出錯:libtiff.so.5:無法打開共享對象文件:沒有這樣的文件或目錄»。

我無法升級另一臺機器,我想避免在虛擬機上編譯(使用與正在運行的機器相同的linux版本)。因此,我想強制編譯器使用libtiff.so.4而不是libtiff.so.5

我在我的電腦上安裝了libtiff.so.4(以及libtiff.so.5)。我如何強制與這個版本的鏈接,而不是更新的版本。我想過移動libtiff.so -> libtiff.so.4,但是如果它需要最新版本,我害怕會破壞我的系統(apt-get purge libtiff5因爲其他軟件包需要它而提供錯誤)。

是否可以鏈接舊的(安裝)版本的庫?如果是,如何? 將libtiff.so的符號鏈接更改爲舊版本會有害嗎?如果不是,它會解決我的問題嗎?

+0

也許使用[LD_PRELOAD](http://en.wikipedia.org/wiki/Dynamic_linker)。 – jml

+0

如何在鏈接時使用.so.4的完整路徑而不是通常的'-ltiff'? (你會需要編譯對抗libtiff4兼容的頭文件)。 –

+0

編譯器無法找到共享庫的位置。我想你也需要通過PATH。 –

回答

2

你可以使用這個語法來連接到一個庫的特定版本:

 
gcc [other options] -l:libtiff.so.4 

你並不需要指定的路徑;搜索常用目錄以查找庫。

注意:正如Michael Wild提到的那樣,您應該安裝該版本的頭文件而不是最新版本。

+0

您可以指出此功能的記錄位置嗎?不知何故,我無法從'gcc'文檔中查找它。 – cmaster

+0

@cmaster它在鏈接器('man ld')中有記錄。尋找'-l'選項。 –

+0

啊,找到它了。謝謝。 – cmaster

0

指定.so的完整路徑:而不是-ltiff/lib64/libtiff.so.4傳遞給鏈接器。

1

正如其他人所提到的,您可以通過指定完整版本名稱或甚至絕對路徑來強制鏈接器。

但是,我強烈建議不要這樣做。問題是,安裝的標題對應於該庫的較新版本。如果這些庫版本之間存在API/ABI突破性變化,程序可能會運行,間歇性崩潰,或者如果運氣不好,根本無法運行。

相反,您應該暫時安裝與libtiff.so.4庫對應的開發包。如果在Debian/Ubuntu或類似的,這將是libtiff4-dev包。