架构arm64的未定义符号.对ObjC++文件进行C调用
Undefined symbols for architecture arm64. Make C calls into ObjC++ file?
我收到这个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)
以下是重现错误所需的所有步骤:
- 我创建了一个新的单视图通用Objective C项目(Xcode版本6.0.1(6A317))
- 然后我创建了一个名为TestClass的新ObjectiveC文件
- 将TestClass.m更改为TestClass.mm
- 在我的.h中添加"
void TestFunction();
" - 在我的.mm中添加"
void TestFunction(){}
" - 将
TestClass.h
导入我的ViewController.m
,并尝试从我的viewDidLoad调用TestFunction()
我正在做一些核心音频工作,需要在MIDI回调中进行一些C++调用,所以我不能进行任何ObjectiveC方法调用,因为它们会阻塞音频线程。
也许Xcode将TestFunction()视为C++调用,所以不会从纯ObjectiveC类中生成它?有没有办法告诉Xcode它是一个C函数?
您需要将您的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编译器不需要篡改名称,因为您不能重载C中的函数名称。当您声明函数在C++中具有外部"C"链接时,C++编译器不会向用于链接的名称添加参数/参数类型信息。
相关文章:
- 编译多个C++文件.调用二进制文件以运行代码
- 无法从 SO 文件调用 SO 文件的函数 - C++生成文件
- 如何从另一个文件调用类构造函数?
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- 当我从头文件和实现文件调用我的函数到我的主文件时,我没有得到任何输出
- 从 Android 中的 C 文件调用C++函数
- 从外部文件C++调用函数
- 如何从多个 cpp 文件调用函数
- 从用户定义的头文件调用函数时出现未定义的引用错误,其实现位于.cpp文件中
- cmake:生成批处理文件调用cl.exe
- 在文件中生成随机数,然后从文件调用它们,然后将它们打印出来
- main.cpp从 .h 文件调用公共虚拟方法
- 如何从 python (py) 文件调用 C++ 函数
- 如何从 cpp 文件调用 setRequestOrientation()
- 调试Visual Studio中可执行文件调用的C 文件
- 可以使用不同的头文件调用相同的函数吗?
- 从 Android 中的原生 c++ 文件调用本机 opencv
- 使用对象文件调用Winapi功能
- 从头文件调用字符串getter函数
- 方法从头文件调用