2013-07-12 67 views
0

我試圖在Linux環境中執行C和C++中的基本代碼。 我正在使用eclipse來運行它。當前項目被創建爲C項目。鏈接器錯誤 - 從C文件中調用C++文件中的函數

我想要做的就是從同一個文件夾中的不同文件中調用一個函數。 我有我的主sample.c,主要我想在A.c調用函數sum(int a, int b)。我能夠運行它。但是,當我在A.cppC++模板文件)中重寫相同的函數總和時,會引發鏈接器錯誤。

gcc -o "Test" ./sample.o 

./sample.o:在功能 主 ':/家/ idtech /工作區/測試/調試/../ sample.c文件:19:未定義 參考總結' collect2:LD返回1個退出狀態化妝:* [測試] 錯誤1

我需要幫助,在同一個文件夾C文件調用函數的C++文件。 請幫我解決這個鏈接器問題。

由於

+0

一般來說,最好張貼代碼片段來幫助其他人診斷你的問題。但我可以猜測你需要使用'extern「C」'。試試這裏:http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c/1041880#1041880 – JoshG79

回答

2

的C++,以便編碼類型信息編譯器mangles的符號名稱。通常,編寫應該暴露在C代碼C++函數時,你會想換行功能在extern "C" { ... }塊,像這樣(或者只是extern "C"前綴作爲@DaoWen指出):

A. CPP:

extern "C" { 
    int sum(int a, int b) 
    { 
     return a+b; 
    } 
} 

caller.c:

extern int sum(int a, int b); 
... 
int main() { sum(42, 4711); } 

通過標記功能extern "C",你犧牲超載能力,因爲不同的過載可以區分只有由他們的損壞符號名稱,你剛纔要求關閉mangling!這意味着你不能這樣做:

extern "C" { 
    int sum(int a, int b) { return a+b; } 
    float sum(float a, float b) { return a+b; } // conflict! 
} 
+2

如果你只有一個這樣的功能,你可以把extern「C」嵌入函數簽名而不是引入新塊:'extern「C」int sum(int a,int b){' – DaoWen

+0

Upvoted不僅用於解釋爲什麼它不起作用,而且解決方案的**缺點**(不會超載)。 –

+0

感謝Martin Martin,我能夠解決它。 – Harsha