2011-07-10 3 views
0

循環バッファオブジェクトを作成するために 'TPCircularBuffer'クラスを使用しています(this website)。 これは私の現在のコードです:オブジェクトをインスタンス化することはできますが、その関数にはアクセスできません - 'Symbol s s not found'エラー

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; 
} 

私は私がそれに引数の正しいタイプを渡しているかなり確信している...

+0

元のコードがC用であることは注目に値するが、私はそれをC++で使用している。 .cファイルの名前を.cppに変更し、ポインタの一部をvoidポインタからfloatに変更しました。voidポインターとのポインタの算術が好きではないようです。 – JimmyB

+0

ソースファイルから 'inline'を削除してみてください。インライン関数は実際にはヘッダファイルにしか属しません。 –

+4

@JimmyB:shoehorningの代わりに['Boost.CircularBuffer'](http://www.boost.org/doc/libs/release/libs/circular_buffer/index.html)を使用することを強くおすすめします**この悪いCコード。 – ildjarn

答えて

6

あなたが混合し、CおよびC++コードと一致しています。

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

ちょうどあなたがTPCircularBuffer.hヘッダなどがどこにこれを行いますので、ちょうどTPCircularBuffer.cpp

にTPCircularBuffer.cファイルの名前を変更し、

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

AlternativlyをC++あまりにとしてコンパイルする場合、このコードは[OK]をする必要があり

+0

はうまくいきました。私はそのコードを含み、ソースファイルの名前をTPCircularBuffer.c(.cppから)に戻して、うまくビルドしました。ありがとうございました! – JimmyB

関連する問題