【问题标题】:C Code Link Errors with an iPhone AppiPhone 应用程序的 C 代码链接错误
【发布时间】:2013-02-15 13:41:26
【问题描述】:

在将少量 C 源文件集成到 Objective-c iOS 项目时,我遇到了链接错误。

C 文件是由另一位在 c 项目和 python 项目中成功使用该代码的开发人员提供给我的。

当我将 c 源代码添加到 XCode 项目中时,代码可以编译,但是在目标 c 文件中添加代码以引用 C 代码后出现链接错误。对于 C 代码中的变量,我得到“重复符号错误”。这是目标 c 代码具有 .m 扩展名的时候。

当我将目标 c 文件更改为 .mm 扩展名时,我从目标 c 代码调用的 C 函数出现“未找到体系结构 i386 的符号”错误。

论坛上有很多关于C和Objective C的问题,我还没有找到解决办法。有什么快速的检查吗?

代码sn-ps:

File: res.h

float Max_Std_Amp = 50;
void RD_Dispose(void);

File: res.c
void RD_Dispose(void) {
   Max_Std_Amp = 0;
}


File: Import.mm
#import "res.h"
void process(UInt32* data, UInt32 dataLength)
{
    RD_Dispose();
}

链接错误:

当 Import.m 具有 .m 扩展名时:

duplicate symbol _Max_Std_Amp in:
    /Users/dayhacker/Library/Developer/Xcode/DerivedData/My_Project-dbvpktweqzliaefgbqbebtdgyrey/Build/Intermediates/My Project.build/Debug-iphonesimulator/Respitory Rate.build/Objects-normal/i386/Import.o

当 Import.mm 具有 .mm 扩展名时:

Undefined symbols for architecture i386:
 "RD_Dispose()", referenced from:
 process(unsigned long*, unsigned long) in Import.o

【问题讨论】:

  • 给出错误信息的具体例子。您的 Objective-C 代码中是否确实定义了与 C 代码中的函数同名的函数?
  • 当目标 c 代码具有“.mm”扩展名时,XCode 给出以下链接错误“未定义符号错误:Apple Mach-O 链接器错误,“RD_Dispose()”,引用自:”在 res .h,我已经定义了“void RD_Dispose(void)”,并且在 RRimport.mm 中,我有一个代码块: void process(UInt32* data, UInt32 dataLength) { RD_Dispose(); }
  • 您可能需要在您的问题上添加更多代码,以及您发布的代码所在的确切文件!
  • 感谢您的建议,我已关注他们并使用代码 sn-p 和特定链接错误更新了问题。

标签: ios objective-c c linker


【解决方案1】:

res.h:

float Max_Std_Amp = 50;

应该是:

extern float Max_Std_Amp;

以及在源文件中定义的实际float (res.c):

float Max_Std_Amp = 50;

否则Max_Std_Amp 将成为包含res.h 的每个源模块的一部分,这不是预期的。

如果你想使用 C++ 中的 C 函数(.mm 是 Objective-C++),你需要将函数声明为具有 C 链接,如下所示:

res.h:

#ifdef __cplusplus
extern "C" {
#endif

void RD_Dispose(void);

#ifdef __cplusplus
}  // extern "C"
#endif

上述使用保护宏和 C 链接定义将允许 res.h 头文件包含在 C 和 C++(Objective-C 和 Objective-C++)源模块中。

【讨论】:

  • 木马,当 Objective-c 文件使用 .m 扩展名时,您的解决方案有效。谢谢!我的应用现在也可以链接并运行了。
  • 谢谢,#ifdef __cplusplus 帮助我完成了这项工作
猜你喜欢
  • 2012-06-06
  • 2010-11-06
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多