簡體   English   中英

在 GCC 中用一個 C function 編譯 C++

[英]Compiling C++ with one C function in GCC

使用 gcc,我想調用一個 C function,在 a.c 文件中聲明,在 a.cpp 程序中。 我正在使用的命令是:

gcc {.cpp files} -lstdc++ {.c file}

我不能只將 C 文件轉換為 CPP,但如果我包含一個常見的 header,那么以下兩種情況之一自然會發生:

  1. CPP 文件不理解 C header 是什么
  2. 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

https://www.geeksforgeeks.org/extern-c-in-c/

為了解決這個問題,必須了解 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM