C++コードは関数がC関数であることを認識する必要があります。状況に現実的な例は以下のようになり
extern "C" [prototype];
:これを行うには、あなたはそれをこのように宣言する必要があり
extern "C" void perlinTest();
この理由はC++ function names are mangledその種類について告げる何かにありますパラメータ。最も低いレベルでは、オーバーロードが許可されています。同じ名前を持つ2つのシンボルを表示することは合理的ではないため、C++では、関数名にパラメータのタイプを示すマーカーを埋め込むことができます。たとえば、void perlinTest()
は、g++
(おそらくはclang++
)のLionボックスに_Z10perlinTestv
と表示されますが、これはABI固有であり、他のプラットフォームでは必ずしも同じではありません。
しかし、Cはオーバーロードをサポートしておらず、関数は名前のマングリングの対象ではないため、C++コードを呼び出そうとするときには、名前が変更された名前を使用してはならないことを知る必要があります。これは、extern "C"
がコンパイラに指示するものです。
あなたのヘッダファイルは、CおよびC++の両方から読めるようにする必要がある場合は、一般的な方法はextern "C"
ブロックでそれらをラップすることです(extern "C" { /* declarations */ }
)自体が(そのCコードがextern "C"
を見ていない#ifdef __cplusplus
プリプロセッサディレクティブに包まれてコード)。
#ifdef __cplusplus
extern "C" {
#endif
/* header body */
#ifdef __cplusplus
}
#endif
また、その機能を提供するライブラリにリンクする必要があります。 – Mat
これはライブラリではありません。私はc関数とそれを呼び出すC++コードの両方を書きました。 – Xavier
次に、Cコードがコンパイルされ、C++コードとリンクされていることを確認する必要があります。 – Mat