您可以将C ++ Linux目标应用程序链接到Objective-C静态库吗?

时间:2012-01-25 19:54:45

标签: c++ objective-c linux static-libraries apple-push-notifications

我已经看到很多关于如何将Objective-C应用程序链接到C ++库的信息,但是你可以反过来吗?

我的合作伙伴和我一直在使用完全使用Objective-C的iPhone应用程序。在项目的一半时间,我们决定为其添加一项新功能。此功能需要推送通知,因此我们需要编写将在Linux机器上运行的服务器端应用程序。此服务器应用程序需要访问用Objective-C编写的一些(实际上)代码。我想我们有两个选择:用C / C ++重写整个东西或者在Linux上重新编译Objective-C代码。由于重写需要太长时间,我想采取第二条路线。

我设法使用GCC和GNUstep将我们将linux服务器应用程序所需的Objective-C类编译成静态库。我想用C ++编写实际的服务器应用程序,但我需要将该应用程序链接到Objective-C库。可以吗?怎么样?

如果没有,任何人都可以告诉我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

Linux上的Gcc应该能够与标准基础类(如NSStringNSArray)一起编译Objective-C。您可能需要apt-get前端到gcc。或者甚至更好地使用LLVM。

只要您不在共享代码中使用Apple库,就可以在Linux上编译它。

如果要从C或C ++应用程序中调用Objective-C功能,则必须将Objective-C功能包装到C函数中。我在回答这个问题时提供了一些指导:is there any way to use Objective-C library in C?

编辑(回答评论的问题)

包装函数必须是 .m 文件,并使用Objective-C编译器进行编译,因为它仍然包含Objective-C代码并且只显示纯 .C 函数。它与 C API 包装器相同,C ++代码仍然需要是C ++代码 - 只需定义extern "C"个函数。在Objective-C中,您需要 extern "C",因为Objective-C仍然是C - 相同的链接等。

您可以在符合GCC的编译器中使用带有简单-l标志的结果库。

Apple库,我指的不仅仅是NSFoundation.h - 特定的iPhone库 - 比如 CocoaTouch

NSFoundation.h绝对由您的Objective-C包/ GNUStep提供。