1

简单的问题:

我创建了一堆 C 帮助程序,并试图将它们包含在一个项目中。我曾认为类似以下的事情是可以的。

MyFuncs.h

typedef struct
{
    float n;
} MyStruct;

float Operation(MyStruct ms);

MyFuncs.m

#import "MyFuncs.h"

float Operation(MyStruct ms)
{
    return ms.n * ms.n;
}

但是,我收到链接器错误“架构 i386 的未定义符号”和“从 x 引用的操作(MyStruct)”

是否有其他方法需要设置头文件/实现 C 文件才能工作?

注意:这是针对使用 Xcode 4.5 的 iOS 项目。

4

3 回答 3

3

不,使用纯 C 没有问题。通常,源文件将被命名*.c而不是*.m,但重命名*.c*.m不应导致错误。

但是,有一个线索:

Operation(MyStruct)引用自x

如果链接器知道函数参数的类型,那是因为您是从 C++ 代码调用函数。您必须extern "C" { ... }按如下方式输入标题:

#ifdef __cplusplus
extern "C" {
#endif

typedef struct
{
    float n;
} MyStruct;

float Operation(MyStruct ms);

#ifdef __cplusplus
}
#endif

如果您的项目中没有任何 C++(包括 Objective-C++*.mm文件),那么这不是您的问题。

于 2012-10-18T17:49:15.583 回答
0

如果它是纯 c,那么“MyFuncs.c”而不是“MyFuncs.m”会更好。

于 2012-10-18T17:49:20.950 回答
-4

调用扩展名为 .mm 的实现文件,如 MyFuncs.mm。

于 2012-10-18T17:47:49.717 回答