2014-10-26 97 views
0

我有一個程序,它調用某些庫函數。我可以成功編譯GCC。然而,當我切換到G ++ 4.7(因爲我需要添加在它的C++代碼),我得到G ++抱怨「未定義的引用」,而GCC成功

undefined reference to <a function name here> 

編譯命令是這樣的:

<gcc or g++> foo.c -o foo <path-to-a-static-library>.a -l<the library>

含有的庫函數我打電話是由C寫的。

我該如何解決?用G ++重新編譯庫?這很糟糕,因爲我們有其他C程序使用該庫。

+7

名稱mangling !!!查找'extern「C」'... – 2014-10-26 22:47:07

+0

@πάνταῥεῖThx。我搜索了一個結果,如「如果需要在C++中使用,C代碼頭應該包含在extern中」。那麼,如果圖書館沒有那個外部C,我什麼都不能做? – 2014-10-26 23:01:53

+2

@PengZhang do'extern「C」{「{」} #include「library.h」 }'您的C++代碼 – 2014-10-26 23:04:43

回答

1

如果你可以改變頭的C庫,你應該用適當的extern "C"部分保護他們:

#ifdef __cplusplus 
extern "C" { 
#endif 

/* C declarations for the library */ 

#ifdef __cplusplus 
} 
#endif 

如果你絕對不能更改的頭文件,你應該確保你可以改變頭文件。如果這絕對不是一種選擇,那就更加努力吧。只有打性的磚牆把一個extern "C"聲明各地#include指令後:

extern "C" { 
#include "c-library-header.h" 
} 

的辦法把extern "C"圍繞#include -directive的原因是,它抑制了頭文件包括C++功能的未來遷移:由於外部包含守衛將圍繞代碼庫散佈,因此當C++功能出現在"c-library-header.h"中時,它將成爲修復它們的維護噩夢。這可能不是當前軟件的一個大問題,但任何成功的軟件往往會增長,並且像刪除extern "C"聲明這樣的遷移會變得有問題。