从 C++ 和 Objective-C++ 链接到 Cocoa 框架

Posted

技术标签:

【中文标题】从 C++ 和 Objective-C++ 链接到 Cocoa 框架【英文标题】:Link with Cocoa Framework from C++ and Objective-C++ 【发布时间】:2012-04-06 05:06:49 【问题描述】:

我正在尝试在基本的 Objective-C++ 文件中使用 Cocoa 框架(具体来说是 MultitouchSupport),但我不断收到未定义的符号错误,好像 g++ 应该具有与 gcc 不同的链接器标志。

我的最终目标是将 C++ 网络库与我从这里获得的一些基本 Objective-C 代码集成:http://steike.com/code/multitouch/。

当我运行它来编译原始代码时,它工作正常:

gcc -F/System/Library/PrivateFrameworks -framework MultitouchSupport test.m -o test -std=c99

但是当我将文件重命名为test.mm,以便以后可以包含和引用 C++ 文件时,以下内容不起作用:

g++ -F/System/Library/PrivateFrameworks -framework MultitouchSupport test.mm -o test

并给我这些错误:

Undefined symbols for architecture x86_64:
"MTDeviceCreateDefault()", referenced from:
    _main in ccq0vzuM.o
"MTRegisterContactFrameCallback(void*, int (*)(int, Finger*, int, double, int))", referenced from:
    _main in ccq0vzuM.o
"MTDeviceStart(void*, int)", referenced from:
    _main in ccq0vzuM.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [testpp] Error 1

我需要做什么才能让这个 Objective-C++ 文件看到我正在寻找的框架,以便我可以使用 C++?

谢谢!

【问题讨论】:

【参考方案1】:

在声明这三个函数的头文件中,是否有一个包装它们的extern "C" 块?像这样?

#ifdef __cplusplus
extern "C" 
#endif

// function declarations here

#ifdef __cplusplus

#endif

如果不是:您可以在头文件中添加一个,或者在该头文件的 #import 周围添加一个类似的包装器。

【讨论】:

非常感谢!我认为整个extern "C" 仅与将 C++ 与 C 混合有关。一切都可以编译,现在我只需要对其进行测试 :) 嗯,你正在混合 C++ 和 C。你在那个库中有普通的 C 函数,你正试图从 C++ 访问它们(实际上,Objective- C++) 代码。库和/或您的代码中也可能包含一些 Obj-C 代码这一事实没有任何区别。

以上是关于从 C++ 和 Objective-C++ 链接到 Cocoa 框架的主要内容,如果未能解决你的问题,请参考以下文章

使用另一个 C++ 类作为参数从 Objective-C(++) 调用 C++ 方法

将 C++ 从 Oreilly 书籍翻译为 Objective-C 的问题(iOS 的 3D 编程)

Firebase:混合 C++ 和 Objective-C SDK 可以吗?

如何在c++中,调用objective-c

从 javascript 到 Objective-C 的通信

objective-c和c++的区别