我正在尝试在Ubuntu 12 Linux上编译Objective-C代码。
main.m看起来像这样:
#import <Foundation/Foundation.h> #import "CEFoo/CEFoo.h" int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog (@"hello world"); [pool drain]; return 0; }
在CEFoo.h中,我有这样的定义:
struct StructName{ // line 86 BOOL first; ... ... }; @interface StructName :NSObject // line 92 BOOL first; // line 93 ... ... @end // 96
当我去编译
gcc main.m `gnustep-config --objc-flags` -lgnustep-base -o main.bin
我得到这个消息:
Foo/CEFoo.h:93:1: error: redefinition of 'struct StructName' Foo/CEFoo.h:86:8: note: originally defined here
我读过这可能是由两次重新定义结构造成的,或者在使用include而不是import时recursion导入。
grep -r "struct StructName" *
只显示定义的一个事件。
我也search了项目中的每个包含语句,并且没有发现include和import的明显用法,或者是CEFoo.h的双重包含/导入(包含多次定义/导入的结构的文件) 。
我怎样才能进一步追捕这件事? 我假定我导入了两次 – 如果我是,有没有办法通过首次定义的详细或日志来观看它?
任何其他的想法,我可以做什么来解决这个问题?
TIA
定义一个类意味着为其创建一个结构体。 而且你碰巧有一个和你的类完全一样的结构。 例如,请查看http://ideone.com/7kvFa上的以下代码:“live”
#import <objc/objc.h> struct name {}; @interface name @end int main() { return 0; }
这是因为GCC处理Objective-C对象的方式。 GCC(在版本4.2.1;我不知道更多的最新版本)将对象视为指向不透明结构的指针。
当你声明一个名为StructName
的类时,GCC隐含地执行以下操作:
struct StructName; typedef struct StructName StructName;
当您尝试使用NSString
对象指针初始化一个NSArray
对象指针时,您可以看到该行为:
NSArray * array = @“Hello world”;
GCC发出以下警告:
警告:不兼容的Objective-C类型初始化'struct NSString *',期望的'struct NSArray *'
所以,即使你仅仅声明了一次struct StructName
,GCC struct StructName
看到两个声明,并且因为这个原因无法编译这个文件。
我建议你重命名你的结构或使用另一个编译器(如LLVM)。