2011-07-10 1 views
0

J'utilise la classe 'TPCircularBuffer' pour créer un objet tampon circulaire, à partir de this website. Ceci est mon code actuel:Possibilité d'instancier un objet sans avoir accès à ses fonctions - Erreur 'Symbol (s) not found'

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

Ligne 1 fonctionne très bien, ce qui signifie que l'éditeur de liens a trouvé le Cpp et les fichiers .h de la classe. Cependant, la ligne 2 ne compile pas, avec l'erreur:

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 

Je ne pense pas que ce soit un problème avec le code source d'origine, mais je vais l'inclure ici de toute façon: TPCircularBuffer.c

TPCircularBuffer.h

Est-ce que quelqu'un sait pourquoi l'éditeur de liens/compilateur ne trouve pas la fonction TPCircularBufferInit? La fonction TPCircularBufferInit est la suivante:

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

Je suis assez sûr que je passe le type d'arguments en elle ...

+0

cela vaut la peine de noter que le code original est pour C, mais je l'utilise en C++. Je viens de renommer le fichier .c en .cpp, et j'ai changé certains des pointeurs de void en float, car il ne semblait pas aimer l'arithmétique du pointeur avec les pointeurs void ... – JimmyB

+0

Essayez de supprimer le 'inline' du fichier source. Les fonctions incorporées n'appartiennent réellement qu'aux fichiers d'en-tête. –

+4

@JimmyB: Je recommande fortement ** d'utiliser ['Boost.CircularBuffer'] (http://www.boost.org/doc/libs/release/libs/circular_buffer/index.html) au lieu d'utiliser ce pauvre code C. – ildjarn

Répondre

6

Vous mélanger et assortir le code C et C++. Le TPCircularBuffer.h n'est pas sécurisé C++, donc lorsque vous l'incluez dans votre source C++, il sera traité en C++. Cela échouera, dans ce cas seulement au moment de la liaison. L'éditeur de liens recherchera des symboles mangés par le nom C++ pour les fonctions de tampon cicrular, mais TPCircularBuffer.c est compilé en tant que code C.

Il suffit de le faire où vous incluez l'en-tête TPCircularBuffer.h:

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

Alternativly, ce code doit être correct lorsqu'il est compilé trop C++, donc Renommez le fichier TPCircularBuffer.c à TPCircularBuffer.cpp

+0

qui a bien fonctionné - j'ai inclus ce code et renommé le fichier source en TPCircularBuffer.c (à partir de .cpp) et il se construit très bien. Je vous remercie! – JimmyB