【问题标题】:Error building pch file with CPP definitions使用 CPP 定义构建 pch 文件时出错
【发布时间】:2010-10-31 20:37:40
【问题描述】:

我们正在向我们的 iPhone 应用程序添加 CoreData 支持。这是一个影响深远的变化(从 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

知道出了什么问题吗?

【问题讨论】:

    标签: xcode gcc uikit c-preprocessor


    【解决方案1】:
        -D<Multiple -Dvalues> 
    <command-line>: error: macro names must be identifiers
    <command-line>: error: ISO C99 requires whitespace after the macro name
    

    您似乎在某些时候编辑了项目或目标的预处理器宏构建设置的所有配置。不同的配置有不同的值。您不是按取消或统一替换它们,而是以某种方式确认占位符文本。

    Xcode 尽职尽责地传递“”作为预处理器定义,而不是您想要的预处理器定义。

    进入目标检查器的 Build 选项卡,找到 Preprocessor Macros,删除其当前值,并将其替换为您真正想要的值。

    【讨论】:

    • Doh,我完全没有重复 :-( 非常感谢。我不知道我是怎么做到的,但今天快速调查,我确实注意到当我试图删除我的 COREDATA 宏时Xcode 没有正确覆盖设置。
    • 谢谢这是问题所在。当您对其他配置有不同的值时,根本原因似乎是为所有配置向 Xcode 添加了编译器标志。例如,我只为我的调试版本定义了 DEBUG。然后当我为所有配置添加 COREDATA 时,Xcode 将其 显示字符串转换为编译器调用中使用的实际值并生成您指出的缺陷。
    【解决方案2】:

    请发布编译器的invocation行,而不仅仅是错误;它告诉我们更多。当上游错误在#importing下游头文件时混淆编译器时,您引用的错误是典型的;这显然并不意味着 CFBag.h 等有错误。

    我的怀疑是,当您创建不同的目标时,您为该目标获得了不同的前缀头文件,并且设置不正确;比较新旧目标的前缀头文件构建设置,并比较文件本身。

    一个常见错误是在 C++ 项目中包含 Objective-C 头文件。那是行不通的;如果要混合使用 Objective-C 和 C++,则需要将 .cpp 文件转换为 .mm 文件。但是 C++ 应该能够#include CoreFoundation 头文件。

    【讨论】:

    • 谢谢。我尝试通过复制现有的构建目标并从头开始设置一个新目标来制作新的变体。我还在原始构建中添加了构建指令,但仍然出现错误。
    【解决方案3】:

    这里有点暗中的刺 - 你是在生成一个预编译的头文件吗?自从您更改了预处理器符号后,您是否重建了预编译的头文件?您可能会看到预编译头文件中内置的符号与其他编译单元中的符号有所不同。

    【讨论】:

    • 赞成,因为这是一个很好的建议,但我正在清理构建并删除预编译的标头。
    猜你喜欢
    • 2019-01-23
    • 2011-11-27
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2011-08-31
    • 2018-08-09
    • 2020-04-07
    • 2019-10-01
    相关资源
    最近更新 更多