c++ - 架构 arm64 的 undefined symbol 。对 ObjC++ 文件进行 C 调用?

标签 c++ ios objective-c xcode

我收到这个 Apple Mach-O 链接器错误:

Undefined symbols for architecture arm64:
  "_TestFunction", referenced from:
      -[ViewController viewDidLoad] in ViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

以下是重现错误所需的所有步骤:

  1. 我创建了一个新的单 View 通用 Objective C 项目(Xcode 版本 6.0.1 (6A317))。
  2. 然后我创建了一个名为 TestClass 的新 ObjectiveC 文件
  3. 将 TestClass.m 更改为 TestClass.mm
  4. 将“void TestFunction();”添加到我的 .h
  5. 将“void TestFunction(){}”添加到我的 .mm
  6. TestClass.h 导入我的 ViewController.m 并尝试从我的 viewDidLoad 调用 TestFunction()

我正在做一些核心音频工作,需要在我的 MIDI 回调中进行一些 C++ 调用,所以我不能进行任何 ObjectiveC 方法调用,因为它们会阻塞音频线程。

也许 Xcode 将 TestFunction() 视为 C++ 调用,所以不会从纯 ObjectiveC 类创建它?有什么方法可以告诉 Xcode 这是一个 C 函数吗?

最佳答案

您需要将您的 C++ 函数标记为 extern "C"
之后 objective-c 代码可以链接到该函数。

你的 TestClass.h 应该是这样的

#if defined __cplusplus
extern "C" {
#endif

void TestFunction();

#if defined __cplusplus
};
#endif  

extern "C"使 C++ 中的函数名称具有“C”链接(编译器不会破坏名称),以便客户端 C 代码可以使用“C”兼容头文件链接到(即使用)您的函数仅包含您的函数声明。您的函数定义包含在二进制格式中(由您的 C++ 编译器编译),然后客户端“C”链接器将使用“C”名称链接到该格式。

由于 C++ 具有函数名称的重载而 C 没有,C++ 编译器不能仅使用函数名称作为链接的唯一 ID,因此它通过添加有关参数的信息来破坏名称。 C 编译器不需要破坏名称,因为您不能在 C 中重载函数名称。当您在 C++ 中声明函数具有 extern "C"链接时,C++ 编译器不会将参数/参数类型信息添加到用于的名称中链接。

关于c++ - 架构 arm64 的 undefined symbol 。对 ObjC++ 文件进行 C 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26404413/

相关文章:

c++ - 具有负值的模运算符

c# - 套接字服务器应用程序的选择 : C/C++ or C#

iOS 应用程序二进制大小

ios - 将 uint8_t 和 uint16_t 转换为 NSMutableData

objective-c - 我可以将 UITapGestureRecognizer 添加到我的 Controller self.view,但不能添加到任何自定义 View 。为什么?

ios - 放置范围并避免在文本字段中使用特殊字符

C++ 如何将数组 int[10] push_back 到 std::vector<int[10]>?

c++ - Intel TBB 并行化开销

android - URL中不同字段的含义

ios - NSDateFormatter 仍在解析而不是格式不正确