2014-10-16 50 views
3

我得到这个苹果的Mach-O链接错误:架构arm64的未定义符号。将C调用到ObjC++文件中?

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. 我创建了一个新的单一视图通用Objective C的项目(Xcode的版本6.0.1(6A317)))。
  2. 我然后创建一个名为TestClass的
  3. 一个新的ObjectiveC文件
  4. 变化TestClass.m到TestClass.mm
  5. 添加 “void TestFunction();” 我的.h
  6. 添加 “void TestFunction(){}” 我.mm
  7. 导入TestClass.h到我的ViewController.m并尝试从我的viewDidLoad调用TestFunction()

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

也许Xcode视图TestFunction()作为一个C++调用,所以不会使它从一个纯粹的ObjectiveC类?有什么办法告诉Xcode它是一个C函数吗?

回答

11

您需要将您的C++函数标记为extern "C"
之后,客观的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中的函数名,因此AC编译器不需要对名称进行重新命名。当您声明函数在C++中具有外部“C”链接时,C++编译器不会将参数/参数类型信息添加到用于连锁。

+1

解决了它谢谢你的信息! 我通过在我的项目中使用构建体系结构,让我感到非常头痛! – user3306249 2014-10-16 12:42:25

+0

你是怎么知道这件事的?我在哪里可以阅读这样的内容?谢谢你的回答,它为我节省了很多时间。 – theFool 2016-07-27 08:56:08

+1

非常感谢你! – 2017-07-04 17:48:55

相关问题