2010-11-14 89 views
2

我想學習使用GCC的Linux上的共享庫概念。所以我創建了一個簡單的庫。創建一個簡單的共享庫

LIBRARY.C

int foo(void) { 
    return 10; 
} 

這是用匯編,

cc -fPIC -g -c library.c 
cc -shared -fPIC -Wl,-soname,libmytest.so.1 -o libmytest.so.1.0.1 library.o -lc 

它創建的文件libmytest.so.1.0.1在當前目錄。現在我正在編寫一個客戶端來在同一個目錄中使用這個庫。

client.c

#include <stdio.h> 

extern int foo(void); 

int main() 
{ 
    int a = foo(); 
    printf("a is %d", a); 
    return 0; 
} 

使用編譯

cc client.c -o client -lmytest 

,但是這將退出與消息

/usr/bin/ld: cannot find -lmytest 
collect2: ld returned 1 exit status 

誰能幫我找出我在做什麼這裏錯了嗎?

回答

4

嘗試使用它用於將目錄添加到被搜索的-l選項目錄列表中選擇一個選項-L

cc client.c -L. -o client -lmytest 

假設.so存在於同一個目錄中client.c。如果沒有添加合適的路徑。

看到鏈接器-lmytest尋找libmytest.so但你有一個版本號附加到它,所以它不起作用。方法來解決這個問題是創建一個名爲libmytest.so指向符號鏈接libmytest.so.1.0.1

ln -s libmytest.so.1.0.1 libmytest.so 

或者,你可以在編譯/鏈接線使用完整的庫名:

cc client.c ./libmytest.so.1.0.1 -o client 
+0

謝謝,但沒有運氣。仍然是同樣的錯誤。我什至試圖指定完整的路徑,但沒有奏效。 – 2010-11-14 15:36:33

+0

我必須運行'ldconfig'嗎? – 2010-11-14 15:39:18

+0

我通過直接提供庫名稱而不是通過-l來實現它。 – 2010-11-14 15:45:44

1

鏈接器通常只有搜索圖書館的系統路徑。通過-Lgcc以指定其他路徑進行搜索。

1

您缺少-Ldir選項。

從GCC手冊頁:

-Ldir Add directory dir to the list of directories to be searched for -l. 

您還需要指定,如果你嘗試運行可執行文件,其中的共享庫所在,否則圖書館將無法找到。

LD_LIBRARY_PATH=. ./client

編輯:

謝謝,但沒有運氣這是可以做到的。仍然是相同的 錯誤。我甚至試圖指定 完整路徑,但沒有奏效。

我認爲鏈接器需要庫有一個.so擴展名。嘗試ln -s libmytest.so.1.0.1 libmytest.so,看看它是否鏈接。

+0

謝謝。解決了問題 – 2010-11-14 15:57:32

+1

作爲每次運行可執行文件時設置'LD_LIBRARY_PATH'的替代方法,您可以在鏈接時設置'LD_RUN_PATH',這會將共享庫的附加搜索路徑嵌入到可執行文件中。 – caf 2010-11-14 22:16:43