Возможность создания объекта, но не доступа к его функциям - ошибка «Символ (ы) не найден» - PullRequest
0 голосов
/ 11 июля 2011

Я использую класс 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;
 }

Я почти уверен, что передаю правильный тип аргументов ...

1 Ответ

6 голосов
/ 11 июля 2011

Вы смешиваете и сопоставляете код C и C ++.

TPCircularBuffer.h не является безопасным для C ++, поэтому, когда вы включаете его в исходный код C ++, он будет рассматриваться как C ++. Это не удастся, в этом случае только во время ссылки. Компоновщик будет искать символы C ++, управляемые по имени, для функций буфера цикулярного типа, но TPCircularBuffer.c скомпилирован как код C.

Просто сделайте это, когда вы включите заголовок TPCircularBuffer.h:

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

Альтернативно, этот код должен быть в порядке, когда он также скомпилирован в C ++, поэтому просто переименуйте файл TPCircularBuffer.c в TPCircularBuffer.cpp

...