C代码链接错误与iPhone应用程序

时间:2013-02-15 13:41:26

标签: ios objective-c c linker

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

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

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

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

在论坛上有很多关于C和目标C的问题,我还没有找到解决方案。有什么快要检查的东西吗?

代码段:

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

1 个答案:

答案 0 :(得分: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-linkage,如下所示:

res.h:

#ifdef __cplusplus
extern "C" {
#endif

void RD_Dispose(void);

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

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