1

matrixlib.aコードをコンパイルするために使用する静的ライブラリがありCます。このコードはでコンパイルされgcc、正常に動作します。C++ただし、このライブラリをコードに導入したいのですが、問題が発生するのはそのときです。コードをコンパイルする方法C

gcc -I/matrix/include -O -Wall example.c -c -o example.o
gfortran example.o /matrix/lib/matrixlib.a -lblas -fopenmp -o example_c

今私たちが交換gccする場合g++

example.c:(.text+0xf5): 「mygemm_solver(int, double const*, double*, double*, int, int)」への未定義の参照

ファイルを使用しているmygemm_solver機能です。example.c私が間違っていることのアイデアはありますか?

4

1 に答える 1

8

の関数example.cはおそらく宣言されていないextern "C"ため、C++ コンパイラは生成されたシンボル名に名前マングリングを適用しています。Fortran コードはマングルされた名前を使用しない可能性が高いため、リンカがその名前を見つけようとしても、シンボルが見つかりません。

最初のステップは、C/C++ コードからヘッダー ファイルに「エクスポート」するすべての関数のプロトタイプを配置することです。これを一番上に置きます:

#ifdef __cplusplus
extern "C" {
#endif

そして、これは一番下にあります:

#ifdef __cplusplus
}
#endif

これは、ヘッダーで宣言されたすべての関数に自動的に適用extern "C"される効果がありますが、C++ としてコンパイルしている場合のみです。

ただし、C と C++ はセマンティクスが異なる別の言語であることに注意することが重要です (たとえば、 からの暗黙的な変換に関してvoid *)。C コードは C コンパイラでコンパイルし、C++ コードは C++ コンパイラでコンパイルする必要があります。有効な C と C++ の両方であり、両方の言語で同じセマンティクスを持つコードを記述することは技術的に可能ですが、これを行う理由はほとんどありません。

于 2013-09-30T15:31:28.163 に答える