3

在 Xcode 中,所有目标的构建设置都继承自项目的构建设置。项目的构建设置继承自“iOS Default”。下面显示了此继承,其中选择了Levels而不是Combined

对于那些不知道的人,项目设置下的粗体条目表示覆盖。通过突出显示设置然后按 COMMAND-BACKSPACE 可以“清除”覆盖。

在此处输入图像描述

对于我创建的每个重要项目,不断改变这些价值观变得非常老旧。特别是像其他 C 标志这样的项目,我必须在其中添加-Wall -Wextra -Wconversion -wstrict-overflow预处理器宏是另一个必须始终修复以包含 Posix 的NDEBUG=1. 我绝对认为缺少NDEBUG=1发布版本是一个错误,因为 Posix 需要NDEBUG删除abort()assert(); 并且 Apple 的 UI 标准不允许abort(). (DEBUG=1对于 Debug 构建来说是类似的,因为尽管 Posix 只是标准化的,但仍有很多人NDEBUG使用它)。

从下面的@Petesh,我知道我可以为每个项目使用一个配置(也许创建一次,然后重新使用它)。但这意味着我正在应用“正确”或“正确”设置来掩盖“IOS 默认”模板中的缺陷设置。我的目的是一劳永逸地解决问题的根源。

如何编辑默认设置模板?文件系统上是否有代表“iOS Default”的物理文件?如果是这样,可以编辑它(是 XML)吗?

更新:基于@Peresh 的回答(没有磁盘文件可以永久修复该问题):RADAR 12941954。它可能会在 Apple 的错误报告系统中未经确认、未答复和未修复多年,就像其他人喜欢的错误一样我和其他人花时间报告。

4

1 回答 1

3

构建配置文件是为预处理/编译选择一组选项的理想方式 - 您使用.xcconfig具有您想要作为基础的设置的文件,然后为目标选择此基础配置。

该文件需要在项目的基础上创建,名称为TargetType.xcconfig. 对于您的基本编译器标志要求,您可以使用包含以下内容的文件:

OTHER_CFLAGS = -Wall -Wextra -Wconversion -wstrict-overflow

一旦您将目标基于.xcconfig文件,它将获得这些选项作为所有指定目标的默认项。

您可以为每个调试和发布添加一个,允许指定NDEBUG=1DEBUG=1选项,例如

GCC_PREPROCESSOR_DEFINITIONS = NDEBUG=1

将此设置应用于配置。

查看基于配置文件的构建配置的 Xcode 帮助。还有一个在线教程可以完成该过程。

我已经使用gcc/ g++spec 文件来操作gcc. 如果您使用gccLLVM 的驱动程序,这仍然有效。默认编译器选项是那些来自未修改的规范文件的选项 - 即它内置在编译器中,并且不驻留在磁盘上。过程是:

gcc -dumpspecs > specs
specdir=$(gcc -print-search-dirs | sed -n 's/install: //p')
sed 's/^\(.*mdynamic-no-pic:-fPIC\)/<default options here> \1/' specs > newspecs
sudo cp newspecs $specdir/specs

您可以通过执行以下操作来验证是否正在使用规范文件:

gcc -v <file>

它应该显示如下内容:

Reading specs from /Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/specs

而不是

Using built-in specs.

这可能会引发混乱,因为这些标志会影响所有 gcc/g++编译 - 即使对于macports包,这意味着它们可能无法正确编译。

clang/ clang++,不幸的是没有规范文件的概念,因此在编译时将忽略此文件 - 它使用的所有选项都是在 clang 构建时定义的。在这种情况下,无法操作默认编译器选项,因为它不会尝试读取磁盘上的文件来确定默认编译器选项。

于 2013-01-01T12:28:30.780 回答