我收到这个 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)
以下是重现错误所需的所有步骤:
- 我创建了一个新的单 View 通用 Objective C 项目(Xcode 版本 6.0.1 (6A317))。
- 然后我创建了一个名为 TestClass 的新 ObjectiveC 文件
- 将 TestClass.m 更改为 TestClass.mm
- 将“
void TestFunction();
”添加到我的 .h - 将“
void TestFunction(){}
”添加到我的 .mm - 将
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/