【问题标题】:Call C function using Objective C class instance使用 Objective C 类实例调用 C 函数
【发布时间】:2012-10-10 22:49:37
【问题描述】:

我有一个带有 C 类型方法的 Objective C 类。我必须用我的代码链接一个 C++ 库和一个 C 库。如果我从任何 Objective C 函数调用库,我会得到链接器错误,它找不到符号。

参考using c++ static library in objective c

但我需要以某种方式调用该 C 函数。有没有其他选择?如果只有 C 库,我可以从目标 C 方法进行库调用,但 C++ 库不允许我这样做。我不知道为什么。

【问题讨论】:

  • 那么您尝试调用 C 或 C++ 的函数是什么?
  • 从另一个问题来看,您正在寻求从Objective C程序调用C++函数的导出extern "C"接口。这会给系统带来麻烦。
  • @JonathanLeffler 为什么会这样?如果一个函数被声明为extern "C",那么就不会出现名称修改问题......而且由于Objective-C是C的严格超集,从Objective-C调用C函数应该不是问题......
  • 我正在尝试调用 c++ 库中的一个函数,而该函数又在内部尝试调用 C 库中的另一个函数。为了调用 c++ 库的函数,我必须在 Objective-C 的 C 风格函数中编写所有此类函数调用。我尝试在 c++ 方法(在头文件中)的声明之前使用 extern "C",编译器显示错误。

标签: c++ objective-c c static-libraries


【解决方案1】:

根据我的经验,如果程序使用任何 C++ 类,您应该使用 C++ 编译器进行链接,以便链接正确的 C++ 库。仅使用 C 和 C++,这相当简单。

将 Objective C 加入其中,您可能会遇到一些困难——您的问题意味着您遇到了一些困难。这个我没试过,但是...

您需要确保链接了正确的 C++ 库、链接了正确的 Objective C 库以及您需要的任何杂散 C 库。如果您可以在构建 Objective C 程序时确定链接的库,那么您只需与 C++ 编译器链接并列出您需要的 Objective C 和纯 C 库就足够安全了。手指交叉,仅此而已。如果对 Objective C 有复杂的设置要求(以及对 C++ 的复杂要求),那么您可能仍然会遇到困难。不过总的来说,你可能还好。

如果有明确经验的人说不同的话,请采用他们的解决方案(如果它适合您)。但我能提供的最好的方法是“将程序与 C++ 编译器链接”。

【讨论】:

  • 我听说过一种叫做“Objective-C++”的东西,它的主要用途是允许从Objective-C调用C++代码。这在这里有用吗?
  • @MikeDeSimone 不,您错过了构建阶段。 Objective-C++ 是一个编译代码的概念。 OP 有困难链接它。
  • 看,c++ 头文件中有一些“命名空间”,所以我必须将我的 Objective-C 文件类型从 Objective-C 源文件转换为 Objective-C++ 源文件。当我这样做时,一些消息来源说链接是通过 c++ 编译器完成的。构建设置中还有一个选项,我可以使用它根据文件类型链接目标。如果我不更改文件类型,我将不得不添加一个链接器标志 -lstd++ 来针对 c++ 进行编译
【解决方案2】:

我不太确定是什么代码导致了您的问题,但如果您想从不同的 C 文件调用在 C++ 文件中定义的 C 风格函数,请确保将该函数标记为 extern "C" 以避免名称混淆。

【讨论】:

  • 我没有c++文件的源代码。我只有头文件中的 api 声明。我尝试用 extern "C" 标记函数的声明,但编译器对此嗤之以鼻。我正在做的是,包括一个 c++ 库,声明它的实例并在目标 C 的函数中调用它的方法。如果目标 C 的这个方法不是 C 风格的,我会得到链接器错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2019-03-08
  • 2012-04-16
相关资源
最近更新 更多