c++ - 能够实例化对象但不能访问其函数 - 'Symbol(s) not found' 错误

标签 c++ circular-buffer undefined-symbol

我正在使用“TPCircularBuffer”类创建循环缓冲区对象,来自 this website . 这是我当前的代码:

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

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

最佳答案

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

TPCircularBuffer.h 不是 C++ 安全的,因此当您将它包含在 C++ 源代码中时,它会被视为 C++。那将失败,在这种情况下仅在链接时。链接器将为循环缓冲区函数寻找 C++ 名称变形符号,但 TPCircularBuffer.c 被编译为 C 代码。

只需在包含 TPCircularBuffer.h header 的地方执行此操作:

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

或者,此代码在编译为 C++ 时也应该没问题,因此只需将 TPCircularBuffer.c 文件重命名为 TPCircularBuffer.cpp

关于c++ - 能够实例化对象但不能访问其函数 - 'Symbol(s) not found' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6644465/

相关文章:

c++ - 如何在 Emacs 中终止正在运行的进程

c++ - 由空指针常量 : which behaviour is correct? 初始化

c++ - 我目前正在使用 C++ builder 6 XE4 开发财务图表。移动到图表 Canvas 上的某个位置时出现异常

c++ - 是否可以将 "for loop"嵌入 "if statement"以在继续使用 C++ 之前比较多个条件

c++ - 使用头文件 : Undefined symbols for architecture x86_64 编译 C++ 程序时出错

c++ - ld 报告缺少符号,但符号似乎存在

circular-buffer - 环形缓冲区和循环链表有什么区别?

java - 无锁圆阵

eventhandler - 为什么 lmax 干扰器架构使用 2 个干扰器?

xcode - 终端中出现 "Undefined symbols for architecture x86_64"但 xcode 中没有错误