使用预处理器宏的条件编译 Xcode



我有一个有两个目标的iOS项目,一个是完整版,另一个是精简版。我使用以下代码来隐藏/显示功能。

#ifdef FULL_VERSION
  NSLog(@"Full version");
#endif 

如果我在项目级别定义预处理器宏,这很有效,但是当我在目标级别设置它们时,它们不起作用。顺便说一下,我将它们设置为这样:

Apple LLVM compiler 3.0 - Preprocessing
  Preprocessor Macros    FULL_VERSION

我需要在目标级别定义它们,以便知道正在运行哪个版本。

知道为什么它们只在项目级别工作吗?

我的问题是该方案没有指向正确的目标。编辑方案解决了这个问题。

预处理器定义按预期处理目标,覆盖或继承项目设置。

一个常见的错误是只在一个(未使用的)配置上设置生成设置。检查是否在所有配置上设置了预处理器定义。

您可以检查构建日志 (Command-7) 以查看是否将正确的选项传递给编译器:搜索 -DFULL_VERSION

在您的目标中,对于所有"预处理器宏",请确保您具有与代码中使用的完全相同的定义,以使用"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 

最新更新