2012-07-20 79 views
0

我搞亂了Linux的共享庫並遇到奇怪的問題。我成功地創建了一個共享庫並獲得librbmp.so.0文件,然後將它鏈接到另外兩個文件:librbmp.solibrbmp.so.0.0.1。然後我將他們複製到/usr/local/lib並運行ldconfig,在這裏我遇到了一個奇怪的行爲 - 另外一個文件出現在/usr/local/lib。它被稱爲--library=ibrbmp.so.0.0.1。奇怪的是,我的應用程序在運行時鏈接到它。符號鏈接奇怪問題

任何人都知道發生了什麼事以及如何強制我的應用鏈接到librbmp.so

這裏有一段代碼:

//creating shared library 
$(CC) -shared -Wl,-soname,-librbmp.so.0.0.1 $(OBJECTS) -o librbmp.so.0 -lc 

//symlinking 
ln -sf librbmp.so.0.0.1 librbmp.so.0 
ln -sf librbmp.so.0.0.1 librbmp.so 
+0

用來創建.so的鏈接命令行是什麼? – 2012-07-20 20:50:47

+0

@ MichaelKrelin-hacker添加了您要求的代碼 – Robin92 2012-07-20 20:56:07

回答

2

在運行應用程序所使用的名稱嵌入在鏈接時庫。因此,在構建過程中,鏈接器引入了一個奇怪的命令行參數。

當使用gcc作爲鏈接器前端時,我認爲參數應該是-Wl,-soname=librbmp.so.0。在您的電話中,額外的-可能是問題的原因。在調用實際的鏈接器之前,似乎有些東西比較愚蠢地將-l的所有實例轉換爲--library=,然後會看到-soname=--library=ibrbmp.so.0.0.1

另請注意,soname通常應指定表示api級別兼容性的表單。所以在你的情況下,soname應該是librbmp.so.0,實際的輸出目標文件是librbmp.so.0.0.1。這樣,您可以在改進庫時增加版本,只要不破壞二進制兼容性,應用程序仍然可以工作。當你打破ABI時,你應該把soname撞到librbmp.so.1等等。

+0

非常感謝。我設法糾正我的錯誤,從而擺脫了一個問題:) – Robin92 2012-07-20 21:05:26