0

このWebサイトから、循環バッファオブジェクトを作成するために「TPCircularBuffer」クラスを使用しています。これは私の現在のコードです:

 TPCircularBufferRecord bufferRecord;                   //1
 TPCircularBufferInit(&bufferRecord, kBufferLength);    //2

行 1 は正常に動作するため、リンカがクラスの .cpp および .h ファイルを見つけたことを意味します。ただし、2 行目はコンパイルされず、次のエラーが発生します。

Undefined symbols:
  "TPCircularBufferInit(TPCircularBufferRecord*, int)", referenced from:
      StereoEffect3::StereoEffect3(ComponentInstanceRecord*)in StereoEffect3-1DB483EC8D75827.o
      StereoEffect3::StereoEffect3(ComponentInstanceRecord*)in StereoEffect3-1DB483EC8D75827.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

元のソース コードの問題ではないと思いますが、とにかくここに含めます: TPCircularBuffer.c

TPCircularBuffer.h

リンカ/コンパイラが関数 TPCircularBufferInit を見つけられない理由を知っている人はいますか? TPCircularBufferInit 関数は次のとおりです。

 inline void TPCircularBufferInit(TPCircularBufferRecord *record, int length) {
     record->head = record->tail = record->fillCount = 0;
     record->length = length;
 }

私はそれに正しいタイプの引数を渡していると確信しています...

4

1 に答える 1

6

C と C++ のコードを混合して一致させています。

TPCircularBuffer.h は C++ セーフではないため、C++ ソースに含めると、C++ として扱われます。この場合、リンク時にのみ失敗します。リンカは、Cicrular バッファ関数の C++ 名でマンゲル化されたシンボルを探しますが、TPCircularBuffer.c は C コードとしてコンパイルされます。

TPCircularBuffer.h ヘッダーをインクルードする場所でこれを行うだけです。

extern "C" {
#include "TPCircularBuffer.h"
};

あるいは、このコードは C++ としてコンパイルされた場合でも問題ないはずなので、TPCircularBuffer.c ファイルの名前を TPCircularBuffer.cpp に変更するだけです。

于 2011-07-10T23:38:46.177 に答える