2009-06-06 3 views
3

iPhone 응용 프로그램에 CoreData 지원을 추가하고 있습니다. SQLitePersistentObject에서 옮겨가는 것은 먼 미래의 변화입니다. 분기를 피하기 위해 우리는 #ifdef 블록 안에 새로운 코드로 단일 코드 라인을 실행합니다.CPP 정의로 pch 파일을 생성하는 중 오류가 발생했습니다.

내 헤더 (#define CORE_DATA_BUILD) 중 하나에서이 코드를 활성화하면 모든 것이 잘 동작합니다. 새 대상을 만들고 거기에 내 전 처리기 매크로를 정의하면 시스템 헤더에 오류가 발생합니다. 구체적으로; CFBag.h, CFArray.h, CFBinaryHeap.h, CFDictionary.h 및 CFSet.h 모두 컴파일에 실패합니다.

오류 :

expected ';', ',' or ')' before '>' token

내가 내 기존 응용 프로그램의 대상을 복사 한 후 GCC-4.2의 C 전 프로세서 정의 섹션에 CORE_DATA_BUILD을 추가하여 나의 새로운 목표를 만들어 - 전처리.

전 처리기 정의가 설정되어 있고 매크로 이름이 Apple 기호와 충돌하지 않는다고 확신합니다. 또한 "Preprocessor Macros Not Used Precompiled Headers"에 정의를 추가 할 때 오류가 나타납니다. 빌드를 지우고 미리 컴파일 된 헤더를 제거했지만 여전히 오류가 발생합니다.

은 엑스 코드에서

호출 및 오류 출력은 : 잘못된 무슨

// 
// Prefix header for all source files of the 'Groove' target in the 'Groove' project 
// 

#ifdef __OBJC__ 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
#endif 

어떤 생각 :

ProcessPCH /var/folders/Ay/AyBvIizJERGjIMkWxjcIfU+++TI/-Caches-/com.apple.Xcode.501/SharedPrecompiledHeaders/UIKit-fzghyhumbyslqcedmtegbkgafwpy/UIKit.h.gch /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h normal i386 objective-c com.apple.compilers.gcc.4_2 
    cd /Users/rog/Development/Groove 
    setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" 
    /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -x objective-c-header -arch i386 -fmessage-length=0 -pipe -std=c99 -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Werror -Wreturn-type -Wunused-variable -DCOREDATA -D<Multiple -Dvalues> -D__IPHONE_OS_VERSION_MIN_REQUIRED=30000 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk -fvisibility=hidden -mmacosx-version-min=10.5 -gdwarf-2 -iquote /Users/rog/Development/Groove/build/Groove.build/Debug-iphonesimulator/Tests.build/Tests-generated-files.hmap -I/Users/rog/Development/Groove/build/Groove.build/Debug-iphonesimulator/Tests.build/Tests-own-target-headers.hmap -I/Users/rog/Development/Groove/build/Groove.build/Debug-iphonesimulator/Tests.build/Tests-all-target-headers.hmap -iquote /Users/rog/Development/Groove/build/Groove.build/Debug-iphonesimulator/Tests.build/Tests-project-headers.hmap -F/Users/rog/Development/Groove/build/Debug-iphonesimulator -F/Users/rog/Development/Groove -I/Users/rog/Development/Groove/build/Debug-iphonesimulator/include -I/Users/rog/Development/Groove/build/Groove.build/Debug-iphonesimulator/Tests.build/DerivedSources/i386 -I/Users/rog/Development/Groove/build/Groove.build/Debug-iphonesimulator/Tests.build/DerivedSources -c /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h -o /var/folders/Ay/AyBvIizJERGjIMkWxjcIfU+++TI/-Caches-/com.apple.Xcode.501/SharedPrecompiledHeaders/UIKit-fzghyhumbyslqcedmtegbkgafwpy/UIKit.h.gch 
<command-line>: error: macro names must be identifiers 
<command-line>: error: ISO C99 requires whitespace after the macro name 
In file included from /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h:39, 
       from /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:6, 
       from /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIAccelerometer.h:8, 
       from /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:9: 
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CFArray.h:173: error: expected ';', ',' or ')' before '>' token 
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CFArray.h:359: error: expected ';', ',' or ')' before '>' token 
In file included from /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h:40, 
etc... 

내 Prefix.pch 파일은 표준?

답변

3
-D<Multiple -Dvalues> 
<command-line>: error: macro names must be identifiers 
<command-line>: error: ISO C99 requires whitespace after the macro name 

어떤 시점에서 프로젝트 또는 대상의 프리 프로세서 매크로 빌드 설정을 모두 편집 한 것처럼 보입니다. 다른 구성에는 다른 값이있었습니다. 취소를 누르거나 균등하게 바꾸는 대신 자리 표시 자 텍스트를 어떻게 든 확인했습니다.

Xcode는 사용자가 원하는 선처리 프로세서 정의 대신 " Multiple"및 "Values ​​>"전 처리기 정의를 의무적으로 전달합니다.

대상 속성의 [빌드] 탭에서 [프리 프로세서 매크로]를 찾아 현재 값을 삭제하고 원하는 값으로 바꿉니다.

+0

Doh, 나는 완전히 그것을 기억하지 못했다 .-- (대단히 감사합니다. 어떻게 그 일을했는지는 잘 모르겠지만, 오늘 빠르게 조사하고 있습니다. COREDATA 매크로를 삭제하려고 할 때 Xcode가 설정을 덮어 쓰지 않고 있다는 것을 알았습니다. –

+0

고마워요. 문제가 있습니다. 근본 원인은 다른 구성에 대해 다른 값이있을 때 모든 구성에 대해 Xcode에 컴파일러 플래그를 추가하는 것 같습니다. 예를 들어 디버그 빌드에만 DEBUG를 정의한 다음 COREDATA 모든 구성에서 Xcode는 표시 문자열을 컴파일러 호출에 사용 된 실제 값으로 변환하고 사용자가 지적한 결함을 생성합니다. –

2

어두운 곳에서 찌르는듯한 비트 - 미리 컴파일 된 헤더 파일을 생성하고 있습니까? 선행 처리기 기호를 변경 한 후 미리 컴파일 된 헤더 파일을 다시 작성 했습니까? 미리 컴파일 된 헤더에 내장 된 심볼과 다른 컴파일 유닛에 표시된 심볼을 볼 수 있습니다.

+1

Upvote 좋은 제안이기 때문에 빌드를 정리하고 미리 컴파일 된 헤더를 제거합니다. –

2

오류가 아니라 행의 컴파일러를 에 게시하십시오. 그것은 우리에게 무한히 많은 것을 말해줍니다. #importing 다운 스트림 헤더 파일 일 때 업스트림 오류가 컴파일러를 혼란스럽게 할 때 인용 한 오류가 일반적입니다. 분명히 CFBag.h 외에도 오류가 있음을 의미하지는 않습니다.

의심되는 점은 다른 대상을 만들 때 해당 대상에 다른 접두사 헤더 파일이 있는데 제대로 설정되지 않았다는 것입니다. 이전 및 새 대상에 대한 접두사 헤더 파일 빌드 설정을 비교하고 파일 자체를 비교하십시오.

일반적인 오류 중 하나는 C++ 프로젝트의 Objective-C 헤더 파일을 포함하는 것입니다. 그건 작동하지 않습니다; Objective-C와 C++을 혼용하려면 .cpp 파일을 .mm 파일로 변환해야합니다. 그러나 C++은 CoreFoundation 헤더 파일을 #include 할 수 있어야합니다.

+0

감사합니다. 나는 기존의 빌드 타겟을 복사하고 처음부터 새것을 설정함으로써 새로운 varient를 만들려고 시도했다. 또한 원래 빌드에 빌드 지시문을 추가했는데 여전히 오류가 발생합니다. –