2012-07-11 7 views
3

우분투 12 Linux에서 Objective-C 코드를 컴파일하려고합니다.오류 : Linux에서 Objective-C로 컴파일 할 때 'struct StructName'메시지를 다시 정의하십시오.

main.m은 다음과 같습니다 : 나는

gcc main.m `gnustep-config --objc-flags` -lgnustep-base -o main.bin 

내가받을 컴파일에 갈 때

struct StructName{ // line 86 
BOOL first; 
... 
... 
}; 

@interface StructName :NSObject // line 92 
BOOL first; // line 93 
... 
... 
@end // 96 

:

CEFoo.h에서
#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; 
} 

, 나는 정의가 이 메시지 :

Foo/CEFoo.h:93:1: error: redefinition of ‘struct StructName’ 
Foo/CEFoo.h:86:8: note: originally defined here 

구조체를 두 번 재정의하거나 가져 오기 대신 include를 사용하는 경우 재귀 적 가져 오기를 수행하면이 문제가 발생할 수 있습니다.

grep -r "struct StructName" * 

정의가 한 번만 나타납니다.

또한 프로젝트의 모든 include 문을 검색했으며 include vs import 또는 명시 적으로 CEFoo.h의 이중 포함/가져 오기를 사용하지 않았 음을 발견했습니다 (정의/가져 오기중인 구조를 포함하는 파일 두 번 이상).

내가 어떻게이 문제의 원인을 추적 할 수 있습니까? 나는 그것을 두 번 가져 오는 것으로 가정합니다. 제가 있다면, 처음에 정의 된 자세한 정보 나 로그를 통해 볼 수있는 방법이 있습니까?

다른 문제 해결 방법은 무엇입니까? 클래스를 정의 TIA

+1

CEFoo.h, 특히 오류가 발생한 93 행을 더 많이 볼 수 있습니다. – Darren

+0

또한이 특별한 경우에는 관련이 없을지라도 미래에 'gnustep'태그를 질문에 추가 할 수 있습니다. – andyvn22

+0

@Darren 코드 예제를 86-92 행으로 편집했습니다. TIA – Geremy

답변

3

는 무엇보다도 그것을위한 구조체를 만드는 것을 의미합니다. 그리고 당신은 당신의 클래스와 똑같은 이름의 구조체를 가지게됩니다. 예를 들어, 때문에 GCC는 목표 - C의 개체를 처리하는 방식이다 http://ideone.com/7kvFa

#import <objc/objc.h> 

struct name {}; 

@interface name 
@end 

int 
main() { 
    return 0; 
} 
+1

도와 주셔서 감사합니다! – Geremy

1

다음 코드 "라이브"를 확인합니다. GCC (4.2.1 버전에서, 나는 더 최근 버전을 모른다)는 객체를 불투명 한 구조의 포인터로 취급한다. 당신이 StructName라는 이름의 클래스를 선언 할 때

, GCC는 암시 적으로 다음을 수행

NSArray *array = @"Hello world";
: 당신이 NSString 개체 포인터와 NSArray 개체 포인터를 초기화 할 때 당신은 그 동작을 볼 수 있습니다
struct StructName; 
typedef struct StructName StructName;

GCC는 다음 경고를 내 보냅니다.

warning: incompatible Objective-C types initializing ‘struct NSString *’, expected ‘struct NSArray *’

따라서 struct StructName을 한 번만 선언하더라도 GCC는 두 가지 선언을보고 그 이유 때문에 파일을 컴파일하지 못합니다.

구조의 이름을 바꾸거나 다른 컴파일러 (예 : LLVM)를 사용하는 것이 좋습니다.

+0

그래서 구조체와 같은 이름의 객체를 갖는 것은 합법적이어야합니다. 그리고 이것은 단지보고있는 gcc 특정 동작일까요? – Geremy

+1

Objective-C에 대한 공식적인 서면 표준은 없지만 C 표준이나 GNUStep 또는 Apple Objective-C 문서에는 두 가지 고유 한 유형으로'struct StructName' 및'StructName'을 사용할 수 없습니다. 그래서 저는 GCC가이를 허용해야한다고 생각합니다. –