1. 程式人生 > >C與C++混合程式設計問題:.C++呼叫.C檔案時出現:undefined reference to `xxxxx()'

C與C++混合程式設計問題:.C++呼叫.C檔案時出現:undefined reference to `xxxxx()'

本人使用qt的介面和opengl功能模擬演算法,該演算法需要在嵌入式中執行,因此需要用純C編寫,此時涉及到在C++寫的qt介面檔案中呼叫C檔案的庫函式,原先以為只需在C++中把C的.h檔案包含進去就可以正常使用,後來發現,使用這種方法時,在程式碼編寫時,C++檔案裡可以直接連結到C檔案的相關函式,所以也就沒在意。程式碼編譯時卻報錯:undefined reference to `xxxxx()',所有的C中的函式均無法連結過去,經過一番搜尋和分析後才找到原因:
原來C和C++採用不同的編譯器,這是因為C++編譯器在編譯.cpp檔案時生成的函式名與C編譯器在編譯.c檔案時生成的函式名是不一樣的,導致C++程式碼無法直接呼叫C的程式碼,兩者混用是會產生不相容的情況,解決辦法如下:
1、確保C和C++採用的是同類型的編譯器,比如本人C用的是GCC,而C++採用的是G++
2.在C的標頭檔案中將C++需要呼叫的所有函式宣告新增extern "C"即可解決,例如
#ifdef __cplusplus

 
extern "C" {

#endif 

extern int test(int, int);

這裡新增C++需要呼叫的所有函式宣告

#ifdef _cpp_
}

#endif

條件編譯#ifdef的作用是,當C++檔案包含該標頭檔案時宣告extern "C",而如果又有一個.C檔案去包含這個標頭檔案時,不宣告extern “C”,需要注意的是:__cplusplus是C++編譯器內建的巨集。