3

現在のC++プロジェクトでは、外部ヘッダーを含めることでレガシーCコードを使用しています。

extern "C" {
# include "ANN/ANN_4t70P1.h"
# include "ANN/ANN_4t70P2.h"
# include "ANN/ANN_4t70P3.h"
# include "ANN/ANN_4t70P4.h"
}

ヘッダーファイルは次のようになります。

extern int ANN_4t70P1(float *in, float *out, int init);

static struct {
  int NoOfInput;    /* Number of Input Units  */
  int NoOfOutput;   /* Number of Output Units */
  int(* propFunc)(float *, float*, int);
} ANN_4t70P1REC = {8,3,ANN_4t70P1};

Cコードは古いバッチファイルによって作成され、C++コンパイラを使用してコンパイルすることはできません。それでも、この実装はWindowsおよびMacOSで正常に機能します。ただし、Linuxでgccとg ++を使用してコードをコンパイルし、アプリケーションを実行すると、ANN_4t70P1RECが誤った値を返します。

プロジェクトをリンクするときに見逃した特別なリンカーフラグはありますか?

ありがとう!

4

1 に答える 1

1

どういう意味:

C コードは古いバッチ ファイルによって作成され、C++ コンパイラを使用してコンパイルすることはできません。

異なるコンパイラによって生成されたオブジェクト ファイルを使用してリンクしていますか? その場合は、次の方法でオブジェクト ファイルを検査してみてください。

readelf -h <objectname>

別の ABI があるかどうかを確認します。コードが非常に古い GCC <3.3/3.4 で生成されている場合、新しいバージョンとのリンクで問題が発生する可能性があります。

リンク中に警告が表示されていませんか?

于 2012-09-18T11:30:10.947 に答える