2013-09-22 55 views
0

我正在使用Linux的64位CentOS版本。我試圖在C和C++程序中創建和使用一個靜態庫(libUtility.a)。我可以用C編譯庫,並用ar生成libUtility.a文件。然後我嘗試將它鏈接到我的程序中。一切正常,當我使用C編譯器使用g ++鏈接問題,但不使用cc

cc myprog.c -o myprog -I/usr/local/include -L/LocationOfMyLib -lUtility 

但是,當我使用g ++編譯器時,我收到錯誤。

g++ myprog.c -o myprog -I/usr/local/include -L/LocationOfMyLib -lUtility 
myprog.c: In function 'int main(int, char**)': 
/tmp/cckIN1Yk.o: In function `main': 
myprog.c:(.text+0x41): undefined reference to `Utility_HiWorld(char*)' 
collect2: ld returned 1 exit status 

我有C和C++適度經驗,但是沒有經驗創造我自己的 庫。這個庫只有一個名爲Utility_HiWorld()的子例程。而myprog.c只能調用一個子例程。我在這裏做錯了什麼?

新:好的,我絕對沒有使用'extern「C」'。我甚至不知道那是什麼。這解決了它。

+0

事實上,C++編譯器能夠告訴你鏈接時**的函數參數**的類型應該警告你。 – 2013-09-22 17:51:49

+0

在庫的頭文件中缺少'extern「C」'? – user786653

+0

C和C++是不同的語言。如果你用C++編譯器編譯你的C程序,它可能會也可能不會工作。 –

回答

4

我猜想,你沒有告訴那個外部函數是用C寫

C++編譯器既然你想使用C和C庫++你需要做你的圖書館這樣的事情頭文件。

#ifdef __cplusplus 
extern "C" { 
#endif 

void Utility_HiWorld(char*); 

#ifdef __cplusplus 
} 
#endif 

__cplusplus只爲一個C++程序,所以C++程序會看到extern "C" { ... }這就是它需要告訴它Utility_HiWorld是一個C函數定義。

查看here瞭解更多詳情。

只是猜測,發佈一些代碼,如果你認爲這個問題是別的。

+0

是的,這固定了它。謝謝! –