C C 混合編譯之extern C的使用

2021-07-30 08:15:15 字數 712 閱讀 2133

最近在用yolo做目標檢測的專案。大家都知道,yolo是乙個純c的框架,只能用gcc編譯器,用g++編譯會報錯。在專案中我自己往框架了新增了一部分c++的**,假設是a.cpp,裡面有函式func(),對應的標頭檔案為a.h。為了能夠讓這兩部分**一起生成可執行檔案,我們需要進行混合編譯。

extern 「c」 可以讓編譯器以c的規則對檔案進行編譯。

c和c++的乙個區別就在於c++的函式是可以過載的,c的函式是不能過載的。因此在編譯c++檔案的時候,乙個函式的標識通常會加上對應的引數列表,但是c中函式編譯的標識只需要函式名就可以了。link階段就是根據這些標識建立不同檔案之間函式的呼叫關係。

所以如果要解決上面的問題,乙個做法就是在a.h裡面func()函式宣告的地方用extern 「c」標識

extern "c" func();
然後編譯的時候首先用g++生成a.o

g++ -c a.h a.cpp
yolo當中本身的**還是用gcc先編譯成xx.o檔案。最後把a.o和xx.o用gcc鏈結即可,假設xx標識生成的可執行檔案

gcc -o xx a.o xx.o
因為用g++在編譯a.cpp的時候我們在func()前面加了extern 「c」,這樣生成的a.o檔案裡面func的函式識別符號僅僅是func函式名,和用gcc編譯生成的識別符號是一致的,所以可以用gcc進行鏈結。

C C 混合程式設計 extern C

1.引言 c 語言的建立初衷是 a better c 但是這並不意味著c 中類似c語言的全域性變數和函式所採用的編譯和連線方式與c語言完全相同。作為一種欲與c相容的語言,c 保留了一部分過程 式語言的特點 被世人稱為 不徹底地物件導向 因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是一...

c c 混合編譯

編譯可以用gcc g gcc c a.c gcc c a.cpp 而鏈結可以用g 或者gcc lstdc 因為gcc命令不能自動和c 程式使用的庫聯接,所以通常使用g 來完成聯接。用gcc編譯c 檔案 gcc o test test.cpp lstdc 如果字尾為.c,並且採用gcc編譯器,則該巨集...

c和c 混合編譯的問題(extern C )

1.引言 c 語言的建立初衷是 a better c 但是這並不意味著c 中類似c語言的全域性變數和函式所採用的編譯和連線方式與c語言完全相同。作為一種欲與c相容的語言,c 保留了一部分過程式語言的特點 被世人稱為 不徹底地物件導向 因而它可以定義不屬於任何類的全域性變數和函式。但是,c 畢竟是一種...