2011-06-14 4 views
1

전역 변수 id theScene을 .mm 파일에 넣을 때마다 오류 Command/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-g++-4.2 failed with exit code 1가 표시됩니다. .m 파일과 함께 작동하지만 나중에 box2d 구현을 위해 .mm이 필요합니다. 또한, 나는 실제 오류가 여기있는 생각 :객관적인 C++에서 전역 변수를 선언 할 때 오류가 있습니까?

ld: duplicate symbol _theScene in /Users/sgupta100/Documents/TheifGame/build/TheifGame.build/Release-iphonesimulator/TheifGame.build/Objects-normal/i386/HelloWorldScene.o and /Users/sgupta100/Documents/TheifGame/build/TheifGame.build/Release-iphonesimulator/TheifGame.build/Objects-normal/i386/TheifGameAppDelegate.o

나는 이것이 정말 누군가가 설명 할 수 있도록 무엇을 의미하는지 몰라?

답변

0

이 변수는 어딘가에서 헤더에 선언되어 있습니까? 그렇다면 선언문에 extern 키워드가 사용됩니까? 그렇지 않으면 컴파일러는 각 컴파일 단위 (.m, .mm, .c, .cpp 등)에 대해 헤더를 표시하는 심볼을 내 보냅니다.

헤더가 문제가되지 않으면 "HelloWorldScene"및 "TheifGameAppDelegate"편집 단위에서 Scene 기호가 생성됩니다. 변수가 둘 다에 정의되거나 함수와 같은 다른 이름이 같은 이름을가집니다.

코드 또는 기타 세부 정보를 게시하지 않아도이 문제에 관해 더 이상 말할 수 없습니다.

업데이트 : 여러 파일에 걸쳐 글로벌 변수를 사용하는 올바른 방법은 ((Objective-) C++로 컴파일하고 변수도에서 액세스 할 필요가있을 때 조건 (extern "C"를 사용하여 헤더에 extern 등의 변수를 선언하는 것입니다 Objective-) C. 그런 다음 정확히 한 번 .m, .mm, .c 또는 .cpp 파일 extern이없고 가능한 한 초기화 프로그램이있는 파일로 정의하십시오. 헤더는 물론 액세스 할 필요가있는 모든 파일에 포함되어야합니다. 변수.

+0

예 .mm 파일에서도 변수를 선언해야했습니다. – dgTheUser

+0

올바른 방법은 변수를 'extern'으로 선언하는 것입니다. (Objective-) C++로 컴파일 할 때 조건 적으로'extern "C"'를 사용하고 (Objective-) C에서 변수에 액세스 할 수 있어야합니다. 그런 다음 .m, .mm, .c 또는 .cpp 파일에 정확히 한 번만 정의하십시오. *는 'extern'없이 * 가능하면 초기화 프로그램과 함께 * 지정할 수 있습니다. 나는 그것이 ".mm"파일에서 선언 할 때 "작동"하는 이유를 의심합니다. 실제로 동일한 변수가 아닙니다. 즉, 한 파일에서 변경하면 다른 파일은 변경 사항을 볼 수 없습니다. C 대 C++ 링크를 찾습니다. – pmdj

+0

유형, 메소드 및 함수 이름만을 기반으로 전역 변수를 재정의 할 수 없습니다. 이와 같이, 'extern "C"'는이 경우에는 필요하지 않습니다. 이는 컴파일러에게 재정의 (override)에 필요한 이름 변환을 적용하지 말 것을 명령하기 때문입니다. 전역을 선언 할 때 일반 'extern'키워드를 사용하고 실제로 전역을 정의하는 곳에 두십시오. – uliwitness

관련 문제