【问题标题】:Linker error calling C-Function from Objective-C++从 Objective-C++ 调用 C-Function 的链接器错误
【发布时间】:2012-03-09 05:32:03
【问题描述】:

我遇到了一个奇怪的链接器问题。我的代码看起来像这样:

    double given_amount = self.modelController.levelCompleteRewardAmount;
    swrve_currency_given(swrve, (CFStringRef)@"currencyName", given_amount);

我在两个不同的地方有这段代码:在一个objective-c 和一个objective-c++ 文件中。它在 Objective-C 领域编译得很好,但是 swrve_currency_given() 函数在我的 WGController.mm 文件中导致以下内容:

Undefined symbols for architecture armv7:
  "swrve_currency_given(Swrve*, __CFString const*, double)", referenced from:
      -[WGController giveTheUserSomeCashForPlayingThisLevel] in WGController.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status

我不完全确定此错误是否与 Obj-C 与 C++ 的事情有关,但它感觉喜欢它。我的理论是它可能认为它是 Obj-C 类的一个函数? 'swrve' 代码是第 3 方代码,一个 .h 和 .c 文件,我正在像这样导入:

#import "swrve.h"

感谢任何帮助! 谢谢

【问题讨论】:

  • 您是否也在项目中为链接器导入它?转到目标的属性,然后在摘要页面上打开“链接的框架和库”。 swrve 库应该在那里;如果不是,请添加它并再次尝试编译。
  • 该库不是静态库/框架,它只是一个 .c 和 .h 文件。 (我已经更新了我的问题以反映这一点)。

标签: objective-c objective-c++


【解决方案1】:

您可能需要在函数原型周围加上:

#if defined __cplusplus
extern "C" {
#endif

void swrve_currency_given (...whatever goes here...);

#if defined __cplusplus
};
#endif

这告诉编译器它是一个 C 函数而不是 C++ 函数。

【讨论】:

  • 看起来有效,但是男孩需要添加很多样板!谢谢!
  • 我添加了一个使用extern "C" 没有块范围的语法变体的变体,我发现它更简洁,因为您只需执行一次样板文件。评论有点太大了,但编辑应该很快就会获得批准。
  • 为后代澄清答案:将此代码添加到 c 代码的 .h 文件中。
【解决方案2】:

如果您在 c++ 文件中使用 c 函数。你应该使用extern "c"{}。 在.h文件中

#ifdef __cplusplus
extern "C" {
#endif

swrve_currency_given(parameter1, parameter2, parameter3);// a c function


#ifdef __cplusplus
}
#endif  

extern "C" 旨在被 C++ 编译器识别并通知 指出的函数是(或将)用 C 编译的编译器 风格。

如果您要链接到编译为 C 代码的库。使用

extern "C" {
  #include "c_only_header.h"
}

看看When to use extern "C" in C++?

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多