Ошибка построения pch файла с определениями CPP - PullRequest
3 голосов
/ 06 июня 2009

Мы добавляем поддержку CoreData в наше приложение для iPhone. Это далеко идущие изменения (переход от SQLitePersistentObject). Чтобы избежать разветвления, мы запускаем одну кодовую строку с новым кодом внутри #ifdef блоков.

Когда я включаю этот код из одного из моих заголовков (#define CORE_DATA_BUILD), все работает нормально. Когда я создаю новую цель и определяю там свой макрос препроцессора, я получаю ошибки в системных заголовках. В частности, CFBag.h, CFArray.h, CFBinaryHeap.h, CFDictionary.h и CFSet.h не удается скомпилировать.

Ошибка:

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

Я создал свою новую цель, скопировав существующую цель приложения, а затем добавив CORE_DATA_BUILD в раздел определений препроцессора GCC-4.2 C .

Я почти уверен, что определение препроцессора установлено, и имя моего макроса не конфликтует с символами Apple. Ошибка также проявляется, когда я добавляю свое определение в «Макросы препроцессора, не используемые в скомпилированных заголовках». Я очистил сборку и удалил предварительно скомпилированные заголовки, но все равно получаю сообщение об ошибке.

Вызов вызовов и ошибок из Xcode:

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 является стандартным:

//
// 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

Есть идеи, что не так?

Ответы [ 3 ]

3 голосов
/ 07 июня 2009
    -D<Multiple -Dvalues> 
<command-line>: error: macro names must be identifiers
<command-line>: error: ISO C99 requires whitespace after the macro name

Похоже, что в какой-то момент вы редактировали все настройки конфигурации макроса препроцессора для вашего проекта или цели. Разные конфигурации имели разные значения. Вместо того, чтобы нажимать Отмена или заменять их равномерно, вы каким-то образом подтвердили текст заполнителя.

Xcode покорно передает «» в качестве определений препроцессора вместо желаемых определений препроцессора.

Перейдите на вкладку «Инспектор целей», найдите макросы препроцессора, удалите его текущее значение и замените его на значение, которое вы действительно хотите.

2 голосов
/ 07 июня 2009

Пожалуйста, отправьте строку invocation компилятора, а не только ошибку; это говорит нам бесконечно больше. Указанная вами ошибка типична, когда ошибка в верхнем потоке путает компилятор, когда он #importing нижестоящих заголовочных файлов; это, очевидно, не означает, что в CFBag.h и др. есть ошибки.

Я подозреваю, что когда вы создали другую цель, вы получили другой файл заголовка префикса для этой цели, и он настроен неправильно; сравните параметры сборки префиксного файла заголовка для старых и новых целей и сравните сами файлы.

Одной из распространенных ошибок является включение заголовочных файлов Objective-C из проекта C ++. Это не работает; вам нужно превратить ваши файлы .cpp в файлы .mm, если вы хотите смешать Objective-C и C ++. Но C ++ должен иметь возможность включать заголовочные файлы CoreFoundation.

2 голосов
/ 06 июня 2009

Немного укола в темноте - вы генерируете предварительно скомпилированный заголовочный файл? Восстановили ли вы предварительно скомпилированный заголовочный файл после изменения символа препроцессора? Возможно, вы видите разницу в символе, встроенном в предварительно скомпилированный заголовок, и в символе, который виден в других единицах компиляции.

...