将少量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
答案 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 ++)源模块中。