2009-05-29 55 views
1

我想學習如何在Linux環境中創建一個C/C++庫,但我在網上有一個問題(可能是微不足道的一個)教程沒有幫助解決。用C創建庫/ C++ - LD找不到我的圖書館

對於確定性讓我們說我有下面的代碼文件的foo.c:

//file: foo.c 
#include <stdio.h> 
void hello(void) 
{ 
    printf("hello!\n"); 
} 

一個foo.h中:

//file: foo.h 
void hello(void); 

,並從使用功能招呼程序() foo.c,命名爲prog.c:

//file: prog.c 

#include "foo.h" 

int main(void) 
{ 
    hello(); 
    return 0; 
} 

這三個文件都在同一個目錄下。然後我編譯foo.c:

gcc -fPIC -c foo.c 

並且得到了一個foo.o文件。然後我用LD創建庫文件:

ld -G foo.o -o libfoo.so 

但是,當我嘗試編譯prog.c中有:

gcc -o prog prog.c -lfoo 

我得到一個錯誤信息:

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

我我相信這是一種微不足道的問題,但我找不到解決方案。所以我的問題是,如果這個過程是錯誤的,或者如果我必須把libfoo.so文件放在一個特殊的路徑中。

的另一個問題是如何改變,如果我用G ++而不是GCC。

謝謝。

編輯:

我知道我可以編譯既prog.c中的foo.c和對prog.o和foo.o的一個鏈接,然後他們作出的可執行文件。但在我最初的問題中,我想以一種可以分發給將在自己的程序中使用我的函數的人的方式編譯foo.c。

回答

6

ld並不默認搜索當前目錄。如果你想要它做的這一點,你需要使用-L命令行選項,所以如果你的庫是在當前目錄下,你需要添加-L.最後GCC調用。如果庫是動態鏈接的,你還需要將當前目錄添加到環境變量LD_LIBRARY_PATH(我假設你在linux上)。

當然,如果你的庫在任何其他非標準路徑中,你需要使用它而不是當前目錄。

3

嘗試

gcc -o prog prog.c -lfoo -L. 

的-L開關增加了它的參數設定的路徑是LD看起來庫文件。 g ++的語法是相同的。

+0

Hummmm ...權。 是否有在LD查找自動庫系統中的任意路徑? – 2009-05-29 19:15:56