有時候在寫 C/C++ 程式,引用了某些 Library,編譯會出現錯誤,後來查找原因
FFmpeg 編譯: undefined reference to ‘av_frame_alloc()’
原來該 Library 是以純 C 寫的,需要以 extern "C"來讓編譯器識別。
看來我真的對 C/C++ 不熟呢~😜
extern "C"是 C++ 中的關鍵字組合,用於指定使用 C 語言的命名和呼叫約定。在 C++ 中,函數和變數名稱可能會經過編譯器進行名稱修飾(name mangling),以支援函數重載、命名空間等特性。而在 C 語言中,沒有這些特性,函數和變數名稱就是它們在原始碼中的樣子。
當你在 C++ 中聲明一個函數或變數時使用 extern "C",它告訴編譯器按照 C 語言的方式處理這個聲明,即不進行名稱構造函數。這樣做的主要原因有兩個:
- 與 C 程式碼的連結性:如果你的 C++ 程式碼需要與純 C 程式碼進行鏈接,你需要確保連結器可以正確找到 C 函數和變數的符號。由於 C++ 對函數名稱進行了修飾,直接連結可能會導致符號不符。使用
extern "C"會告訴 C++ 編譯器依照 C 語言的規則產生符號,從而保證與 C 程式碼的正確連結。 - 提供 C 接口:在某些情況下,你可能需要提供一個 C 接口,以便其他編程語言或平台可以方便地調用你的代碼。透過使用,你可以確保 C 接口的函數名和變數名與 C 的二進位級別
extern "C"上語言相容。
下面是一個簡單的範例,說明如何在 C++ 中使用 extern "C":
#ifdef __cplusplus
extern "C" {
#endif
// C-style function declaration
void myCFunction();
#ifdef __cplusplus
}
#endif
以上程式碼中,#ifdef __cplusplus 並且 #endif 是為了在 C++ 編譯環境中包圍 extern "C"部分,以確保只有在 C++ 編譯時才進行這樣的宣告。
參考:ChatGPT。
隨意留個言吧:)~