GCCとICCで問題なくコンパイルできる小さなプログラムがありますが、コードをG++とICPCでも動作させたいと思います。私はこれを追加しようとしました:
#ifdef __cplusplus
extern "C" {
#endif
最初とこれ:
#ifdef __cplusplus
}
#endif
すべてのヘッダーファイルの最後にありますが、それでも「...」への「未定義の参照」エラーがいくつか発生します。
GCCとICCで問題なくコンパイルできる小さなプログラムがありますが、コードをG++とICPCでも動作させたいと思います。私はこれを追加しようとしました:
#ifdef __cplusplus
extern "C" {
#endif
最初とこれ:
#ifdef __cplusplus
}
#endif
すべてのヘッダーファイルの最後にありますが、それでも「...」への「未定義の参照」エラーがいくつか発生します。
間違っていると思います...externCは、関数のマングリングを無効にするためのものです。したがって、ヘッダーファイルに対してのみ実行すると、マングルされたオブジェクトコードをリンクしようとすると、宣言された関数名がオブジェクトファイルの関数名と一致しなくなります。
とにかく、アプリケーション全体がコンパイルされ、同じC ++コンパイラでリンクされている場合、extern Cは移植性を追加しません。これは、CライブラリとC++コードを混在させることを目的としています。
コードがCとC++の共通のサブセットにある場合は、どちらのコンパイラでもコンパイルできるはずですが、その理由はわかりません(C ++はより厳密であるため、驚き最小の原則に基づいて作業する以外に)いくつかのこと)。
を入力すると宣言と定義が一致しないため、未定義の参照が取得されますextern "C"
。これにより、名前のマングリングが発生しなくなります。ただし、この場合、これはヘッダーファイルでのみ発生します。
未定義の参照の1つがgxx_personalityである場合、「fortran」による投稿は正しいと言えます。
この以前の質問に対する私の回答を参照してください:extern "C"を簡単な言葉で使用するのはいつですか?
うまくいけば、CコードとC++コードを組み合わせる方法が明確になるはずです。