能够实例化对象但不能访问其功能 - "未找到符号"错误

Jim*_*myB 0 c++ circular-buffer undefined-symbol

我正在使用'TPCircularBuffer'类来创建一个循环缓冲区对象,来自这个网站.这是我目前的代码:

 TPCircularBufferRecord bufferRecord;                   //1
 TPCircularBufferInit(&bufferRecord, kBufferLength);    //2
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)

我不认为这是原始源代码的问题,但无论如何我都会在这里包含它: TPCircularBuffer.c

TPCircularBuffer.h

有谁知道为什么链接器/编译器找不到函数TPCircularBufferInit?TPCircularBufferInit函数如下:

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

我很确定我正在将正确类型的参数传递给它......

nos*_*nos 6

您正在混合和匹配C和C++代码.

TPCircularBuffer.h不是C++安全的,所以当你将它包含在C++源代码中时,它将被视为C++.这将失败,在这种情况下仅在链接时.链接器将为cicrular缓冲区函数查找C++名称管理符号,但TPCircularBuffer.c编译为C代码.

只需在包含TPCircularBuffer.h标头的位置执行此操作:

extern "C" {
#include "TPCircularBuffer.h"
};
Run Code Online (Sandbox Code Playgroud)

另外,这个代码在编译为C++时也应该没问题,所以只需将TPCircularBuffer.c文件重命名为TPCircularBuffer.cpp即可.