Возможность создать экземпляр объекта, но не получить доступ к его функциям — ошибка «Символ (ы) не найден»

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

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


person JimmyB    schedule 10.07.2011    source источник
comment
стоит отметить, что исходный код предназначен для C, но я использую его в C++. я просто переименовал файл .c в .cpp и изменил некоторые указатели с void на float, так как мне не нравилась арифметика указателей с указателями void...   -  person JimmyB    schedule 11.07.2011
comment
Попробуйте удалить inline из исходного файла. Встроенные функции действительно принадлежат только файлам заголовков.   -  person Kerrek SB    schedule 11.07.2011
comment
@JimmyB: я настоятельно рекомендую использовать Boost.CircularBuffer вместо того, чтобы копаться в этом плохом коде C.   -  person ildjarn    schedule 11.07.2011
comment
спасибо ildjarn, сейчас проверю библиотеку boost!   -  person JimmyB    schedule 11.07.2011
comment
@ildjarn Я бы хотел использовать boost, но не могу его установить...   -  person JimmyB    schedule 11.07.2011
comment
@JimmyB: Boost.CircularBuffer предназначен только для заголовков, устанавливать нечего - вам просто нужны файлы заголовков.   -  person ildjarn    schedule 11.07.2011


Ответы (1)


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

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

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

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

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

person nos    schedule 10.07.2011
comment
это сработало отлично - я включил этот код и переименовал исходный файл обратно в TPCircularBuffer.c (из .cpp), и он отлично строится. спасибо! - person JimmyB; 11.07.2011