代码之家  ›  专栏  ›  技术社区  ›  Rog

用cpp定义生成pch文件时出错

  •  3
  • Rog  · 技术社区  · 15 年前

    我们正在为我们的iPhone应用程序添加coredata支持。这是一个影响深远的变化(从SQLitePersistentObject开始)。为了避免分支,我们正在运行一条代码行,其中包含新代码 #ifdef 阻碍。

    当我从我的一个头部(定义核心数据构建)启用此代码时,一切都正常工作。当我创建一个新的目标并在那里定义我的预处理器宏时,系统头中会出现错误。具体来说,cfbag.h、cfarray.h、cfbinaryheap.h、cfdictionary.h和cfset.h都无法编译。

    错误是:

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

    我通过复制现有的应用程序目标,然后将核心数据构建添加到 C GCC-4.2-预处理的预处理器定义部分。

    我很确定预处理器定义已经设置好了,我的宏名不会与任何苹果符号冲突。当我将定义添加到“预编译头中未使用的预处理器宏”时,也会出现此错误。我已经清理了生成并删除了预编译头,但仍然收到错误。

    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 回复  |  直到 8 年前
        1
  •  3
  •   cdespinosa Martin Cote    15 年前
        -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>”作为预处理器定义,而不是您想要的预处理器定义。

    转到“目标检查器生成”选项卡,查找预处理器宏,删除其当前值,并将其替换为真正需要的值。

        2
  •  2
  •   1800 INFORMATION    15 年前

    这里有点暗中操作—您正在生成预编译头文件吗?自从更改预处理器符号后,是否重新生成了预编译头文件?您可能会看到预编译头中内置的符号与其他编译单元中看到的符号之间存在差异。

        3
  •  2
  •   cdespinosa Martin Cote    15 年前

    请张贴 调用 编译器的行,不仅仅是错误;它告诉我们无限多的信息。当上游错误在导入下游头文件时混淆编译器时,您引用的错误是典型的;显然,这并不意味着cfbag.h等中存在错误。

    我的怀疑是,当您创建不同的目标时,该目标的前缀头文件不同,并且设置不正确;请比较旧目标和新目标的前缀头文件生成设置,并比较文件本身。

    一个常见的错误是从C++项目中包含ObjtoE-C头文件。这不起作用,如果你想混合Objto-C和C++,你需要把.cpp文件转换成.mm文件。但是C++应该能够包含CopeFoundation头文件。