[英]Compiling C++ with one C function in GCC
使用 gcc,我想調用一個 C function,在 a.c 文件中聲明,在 a.cpp 程序中。 我正在使用的命令是:
gcc {.cpp files} -lstdc++ {.c file}
我不能只將 C 文件轉換為 CPP,但如果我包含一個常見的 header,那么以下兩種情況之一自然會發生:
我該怎么做呢? 我可以以某種方式編譯之前的 C function 然后使用它嗎?
原因是C++允許方法重載。 為此,編譯器標記方法名稱以指示可以傳遞的參數類型(所謂的“名稱改編”)。
As mentioned in the comments, you need to use extern C
declarations in any C++ method calling C. To allow C to call C++, you need an extern C
method in the C++ source to allow it to be called from C. Make sense?
相應地構建您的 header,以便它可以從 C 和 C++ 來源中包含:
#ifdef __cplusplus
extern "C" {
#endif
... // body of header
#ifdef __cplusplus
} // closing brace for extern "C"
#endif
有關詳細信息,請參閱: https://www.oracle.com/technical-resources/articles/it-infrastructure/mixing-c-and-cplusplus.html
為了解決這個問題,必須了解 C 和 C++ 語言是如何編譯的。 我不會在這里嘗試解釋, 其他人已經比我做得更好了。 因此,我將僅提及相關部分。
C 或 C++ 標頭沒有什么特別之處, #include
字面上只是粘貼文件內容(遞歸)。
每個翻譯單元(~ one.c{pp} 文件和所有包含的頭文件)都被單獨編譯成一個包含符號表和(幾乎)編譯代碼的 object 文件。
可能導致該問題的是 C 或 C++ 文件中的特定代碼(兩種語言都不是另一種語言的超集)或 C++ 符號修改 - 正如@pmg 所指出的。 前者無能為力。 后者可以使用extern "C"
解決
foo.h
void foo(void);
foo.c
#include "foo.h"
#include <stdio.h>
void foo(void){
printf("Hello from C\n");
}
運行gcc -c foo.c
foo.o
創建包含 function 符號foo
的實現的 foo.o。
主.cpp
extern "C"{
#include "foo.h"
}
int main(){
foo();
}
同樣, g++ -c main.cpp
將創建main.o
object 文件。
然后,運行g++ -o program.out main.o foo.o
將它們鏈接在一起成為program.out
可執行文件。
> ./program.out
Hello from C
extern "C"{}
禁用符號修飾,因為包含的代碼只是粘貼在那里,所以它適用於整個文件。 所以, main.o
function 符號表說它尋找foo
function 符號而不是_Z3foov
或類似的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.