使用预处理器宏进行条件编译 Xcode
Posted
技术标签:
【中文标题】使用预处理器宏进行条件编译 Xcode【英文标题】:Conditional compilation Xcode using preprocessor macros 【发布时间】:2012-08-08 17:50:28 【问题描述】:我有一个 ios 项目,有两个目标,一个是完整版,另一个是精简版。 我正在使用以下代码来隐藏/显示功能。
#ifdef FULL_VERSION
NSLog(@"Full version");
#endif
如果我在项目级别定义预处理器宏,这很有效,但是当我在目标级别设置它们时它们不起作用。 顺便说一句,我是这样设置它们的:
Apple LLVM compiler 3.0 - Preprocessing
Preprocessor Macros FULL_VERSION
我需要在目标级别定义它们以便知道哪个版本正在运行。
任何想法为什么它们只在项目级别工作?
【问题讨论】:
你为什么要设置完整版,你不应该设置 FULL_VERSION 吗? @GordonDove 我在这里写错了,但我在代码和预处理器宏中都有 FULL_VERSION。但我仍然有这个问题。 【参考方案1】:我的问题是该方案没有指向正确的目标。编辑方案解决了这个问题。
【讨论】:
【参考方案2】:预处理器定义确实按预期作用于目标,覆盖或继承项目设置。
一个常见的错误是只在一个(未使用的)配置上设置构建设置。检查您是否在所有配置上设置了预处理器定义。
您可以检查构建日志 (Command-7) 以查看是否将正确的选项传递给编译器:搜索 -DFULL_VERSION
。
【讨论】:
我在所有配置上都设置了宏:构建、发布和部署。检查构建日志,我看到唯一传递的值是项目设置中设置的值,特定目标上覆盖的值没有传递给编译器。 那么您遇到了其他类型的错误,您的 Xcode 版本中的(很少)错误,或者只是犯了一个错误。【参考方案3】:在您的目标中,对于所有“预处理器宏”,请确保您具有与您在代码中使用的完全相同的定义,以使用“FULL_VERSION”(减去引号)。展开该框以绝对确保每个配置也都有定义。
您实际上可以通过选择左侧窗格中的右侧图标并选择最顶部的“构建”来查看编译器正在执行的操作。找到正在编译的文件,选择该行,然后单击该行中最右侧的图标以查看实际的编译命令。我有两个预处理器定义,您可以在下面看到。此外,选择那个巨大的编译行,将其粘贴到一个空的 TextEdit 窗口中,然后搜索“-D” - 你应该在那里看到 -DFULL_VERSION。如果你没有看到你没有在构建命令中正确输入它 - 错误的目标,错误的配置等。在使用 Xcode 的 8 年中,我从未见过这个功能失败。
我的编译行之一:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-c -arch i386 -fmessage-length=0 -std=c99 -fobjc-arc … -DUNIVERSAL -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk -fexceptions … LTSharing.m -o ...LTSharing.o
【讨论】:
是的,我两者都一样。但我仍然有这个问题。以上是关于使用预处理器宏进行条件编译 Xcode的主要内容,如果未能解决你的问题,请参考以下文章