GNU/Linux >> Linux の 問題 >  >> Linux

C++ コードから C 関数を呼び出す

次のように C コードをコンパイルします。

gcc -c -o somecode.o somecode.c

次に、次のような C++ コード:

g++ -c -o othercode.o othercode.cpp

次に、C++ リンカーを使用してそれらをリンクします。

g++ -o yourprogram somecode.o othercode.o

また、C 関数の宣言をインクルードするときに、C ヘッダーが来ることを C++ コンパイラに伝える必要があります。だから 07 で始まる:

extern "C" {
#include "somecode.h"
}

14 次のようなものが含まれている必要があります:

 #ifndef SOMECODE_H_
 #define SOMECODE_H_

 void foo();

 #endif

(この例では gcc を使用しましたが、原則はどのコンパイラでも同じです。C と C++ としてそれぞれ別々にビルドし、それをリンクします。)

他の回答とコメントから少しずつ集めて、C と C++ のコードを明確に分離した例を示します。

C パート:

foo.h :

#ifndef FOO_H
#define FOO_H

void foo(void);

#endif 

foo.c

#include "foo.h"

void foo(void)
{
    /* ... */
}

これを 29 でコンパイルします .

C++ の部分:

bar.cpp

extern "C" {
  #include "foo.h" //a C header, so wrap it in extern "C" 
}

void bar() {
  foo();
}

これを 34 でコンパイルします

そして、すべてをリンクします:

g++ -o myfoobar foo.o bar.o

理由: C コードは、46 ではなく、プレーンな C コードである必要があります。 s は「いつか別の言語からこれを呼び出すかもしれない」という意味です。 C++ プログラマーがあなたの C 関数を呼び出す場合、それは彼らの あなたの問題ではなく、それを行う方法の問題。また、C++ プログラマーの場合、C ヘッダーは自分のものではない可能性があり、変更すべきではありません。 ) は C++ コードに属します。

もちろん、C ヘッダーを 65 にラップする以外は何もしない便利な C++ ヘッダーを自分で作成することもできます。


Linux
  1. 未定義の関数simplexml_load_file()の呼び出し–PHPエラー[解決済み]

  2. GitHubリポジトリからコードの行数を検索します

  3. Find -exec呼び出しでユーザー定義関数を実行しますか?

  1. C++ で C 関数を呼び出す方法、C で C++ 関数を呼び出す方法 (C と C++ の混合)

  2. アセンブリ (yasm) コードから 64 ビット Linux で C 標準ライブラリ関数を呼び出せない

  3. Ubuntu から VS Code と設定を削除するにはどうすればよいですか?

  1. Rsync〜/ foo Target / fooはRsync〜/ foo / Target / foo /と同じですか?

  2. Awk内のBashスクリプトでBash関数を呼び出す方法は?

  3. 以下で宣言された呼び出し関数