有人能解释一下为什么我的C文件和Objective-C++;文件导致此链接器错误?

有人能解释一下为什么我的C文件和Objective-C++;文件导致此链接器错误?,c,xcode,linker,symbols,objective-c++,C,Xcode,Linker,Symbols,Objective C++,因此,我将几个C文件导入到我的XCode项目中。主C文件包含以下函数: void myFunction (char* arg1, int arg2, int arg3, int arg4) { // My code here } 然后我为这个文件创建了以下头文件,包括在原始C文件和调用函数的.mm文件中 #ifndef _HEADER_H #define _HEADER_H // ... /* Function prototype */ void myFunction(char*,

因此,我将几个C文件导入到我的XCode项目中。主C文件包含以下函数:

void myFunction (char* arg1, int arg2, int arg3, int arg4) {
    // My code here
}
然后我为这个文件创建了以下头文件,包括在原始C文件和调用函数的.mm文件中

#ifndef _HEADER_H
#define _HEADER_H

// ...

/* Function prototype */
void myFunction(char*, int, int, int);

#endif
最后,在我的.mm文件中,我尝试调用它:

myFunction(myString, 100, 50, 32);
我得到以下链接器错误:

架构x86_64的未定义符号: “myFunction(char*,int,int,int)”,引用自: -TestFile.o中的[TestFile awakeFromNib] ld:找不到架构x86_64的符号 叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用)

但是,如果我将我的C文件修改为如下所示:

void testFunction() {
     myFunction("test", 1, 2, 3);
}

void myFunction (char* arg1, int arg2, int arg3, int arg4) {
    // My code here
}

并注释掉.mm文件中的行,效果很好。仅当我尝试从.mm文件访问myFunction()时才会发生此错误。你知道这是什么原因吗?我已经阅读了有关C++和Obj-C混合的问题,但是从来没有直接的C。谢谢

当您在
.mm
文件中包含c函数时,您需要使用
外部“c”
,类似于

extern "C" {
#    include "c-header.h"
}
或者,只需将
外部“C”
添加到函数声明中即可

之所以这样做,是因为C++中使用的名称转换,允许函数重载,实际函数名根据编译器的参数由编译器修改。


省略参数之所以有效,可能是因为当函数未指定参数时,损坏的名称与原始名称相同。

请查看任何基金会的函数原型。 它们都有前缀
CF\u EXTERN
。 您还应该为您计划在
objective-c
c++
objective-c++
代码中调用的函数原型编写此前缀。
当然,有了这个前缀,您将失去c++的函数重载功能。

我以前看到过。。。但是我一直把它放在我的C头文件而不是.mm文件中。成功了!谢谢:)