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

Ios iPhone应用程序的C代码链接错误,ios,objective-c,c,linker,Ios,Objective C,C,Linker,在将少量C源文件集成到objective-CIOS项目中时,我遇到了链接错误 C文件是另一位开发人员提供给我的,他在C项目和python项目中成功地使用了代码 当我将c源代码添加到XCode项目中时,代码会编译,但在目标c文件中添加代码以引用c代码后,我会得到链接错误。我得到了C代码中变量的“重复符号错误”。这是当目标c代码具有.m扩展名时 当我将objective c文件的扩展名更改为.mm时,我从objective c代码中调用的c函数会出现“symbols not found for ar

在将少量C源文件集成到objective-CIOS项目中时,我遇到了链接错误

C文件是另一位开发人员提供给我的,他在C项目和python项目中成功地使用了代码

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

当我将objective c文件的扩展名更改为.mm时,我从objective c代码中调用的c函数会出现“symbols not found for architecture i386”错误

论坛上有很多关于C和objective 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
Undefined symbols for architecture i386:
 "RD_Dispose()", referenced from:
 process(unsigned long*, unsigned long) in Import.o
当Import.mm具有.mm扩展名时:

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
Undefined symbols for architecture i386:
 "RD_Dispose()", referenced from:
 process(unsigned long*, unsigned long) in Import.o
决议h:

#ifdef __cplusplus
extern "C" {
#endif

void RD_Dispose(void);

#ifdef __cplusplus
}  // extern "C"
#endif
这应该是:

extern float Max_Std_Amp;
以及源文件(
res.c
)中定义的实际
浮点值:

否则,
Max\u Std\u Amp
将成为包含
res.h
的每个源模块的一部分,而这不是预期的

如果您想使用C++中的C函数(<代码> .mm. /COD>是ObjuleC++),则需要声明该函数为C链接,例如:

决议h:

#ifdef __cplusplus
extern "C" {
#endif

void RD_Dispose(void);

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

以上使用保护宏和C链接定义将允许<代码> RES.H./Cuth>头文件被包含在C和C++(Objul-C和Objul-C++)源模块中。

float Max_Std_Amp = 50;
#ifdef __cplusplus
extern "C" {
#endif

void RD_Dispose(void);

#ifdef __cplusplus
}  // extern "C"
#endif
这应该是:

extern float Max_Std_Amp;
以及源文件(
res.c
)中定义的实际
浮点值:

否则,
Max\u Std\u Amp
将成为包含
res.h
的每个源模块的一部分,而这不是预期的

如果您想使用C++中的C函数(<代码> .mm. /COD>是ObjuleC++),则需要声明该函数为C链接,例如:

决议h:

#ifdef __cplusplus
extern "C" {
#endif

void RD_Dispose(void);

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

以上的使用保护宏和C链接定义将允许<代码> RES.H./Cuth>头文件被包含在C和C++(ObjuleC和Objul-C++)源模块中。您的Objective-C代码中是否确实定义了与C代码中的函数同名的函数?当Objective-C代码具有“.mm”扩展名时,XCode会给出以下链接错误“未定义的符号错误:Apple Mach-O链接器错误,“RD_Dispose()”,引用自:“在res.h中,我定义了“void RD_Dispose(void)”在RRimport.mm中,我有一个代码块:void进程(UInt32*data,UInt32 dataLength){RD_Dispose();}您可能需要在您的问题上添加更多的代码,以及您发布的代码所在的确切文件!谢谢你的建议,我已经按照他们,并更新了一个代码片段和具体的链接错误的问题。给出错误消息的具体例子。您的Objective-C代码中是否确实定义了与C代码中的函数同名的函数?当Objective-C代码具有“.mm”扩展名时,XCode会给出以下链接错误“未定义的符号错误:Apple Mach-O链接器错误,“RD_Dispose()”,引用自:“在res.h中,我定义了“void RD_Dispose(void)”在RRimport.mm中,我有一个代码块:void进程(UInt32*data,UInt32 dataLength){RD_Dispose();}您可能需要在您的问题上添加更多的代码,以及您发布的代码所在的确切文件!感谢您的建议,我已经按照他们的建议进行了操作,并用代码片段和特定链接错误更新了问题。特洛伊木马程序,当objective-c文件使用.m扩展名时,您的解决方案有效。谢谢我的应用程序现在也链接并运行。谢谢,#ifdef_uucplusplus帮助我获得了这个工作特洛伊木马。如果objective-c文件使用.m扩展名,您的解决方案也可以工作。谢谢我的应用程序现在也可以链接和运行了。谢谢,#ifdef_uucplusplus帮助我实现了这一点