子项目的 Xcode 环境变量

Posted

技术标签:

【中文标题】子项目的 Xcode 环境变量【英文标题】:Xcode environment variables for sub projects 【发布时间】:2011-11-25 06:34:14 【问题描述】:

我当前的 Xcode ios 项目使用了许多静态库。静态库中的不同代码模块具有不同级别的调试,我可以在该模块中使用 #defines 打开/关闭这些调试。

我想要做的是在库中将所有调试默认设置为关闭,然后从父项目设置调试级别。我想这样做,所以任何使用 lib 的项目都必须显式打开调试。

所以 MainProj 使用 myLib1 和 myLib2 等。在 myLib1 中有一个名为 fooModule 的模块。 fooModule 有调试代码如:

#if FOOMODULE_DEBUG_LEVEL > 0
//debug code, console logs etc
#endif

我希望能够在父项目中定义 FOOMODULE_DEBUG_LEVEL,以便库在构建时选择它并正确编译。

我试过了:

#define FOOMODULE_DEBUG_LEVEL 1 

在主项目 .pch 并且我尝试将 FOOMODULE_DEBUG_LEVEL 添加为用户定义的环境变量,值为 1。子项目库都没有选择这两个变量。

有没有办法做到这一点,还是我以错误的方式处理这个问题?

【问题讨论】:

【参考方案1】:

您可以通过创建 xcconfig 文件然后在整个项目中引用或#include-ing 来完成此操作而无需多个定义。因此,您可以应用 Mattias 的建议,然后在 xcconfig.xml 中定义预处理器定义。那么您有一个文件要更改(如果您需要 pch 文件中的这些定义,则需要完全重建,这些文件有单独的设置)。

xcode 还允许您为每个构建配置分配单独的 xcconfig。

【讨论】:

我将 AppDebug.xcconfig 添加到我的项目中,并在项目信息页面中将我的调试和发布版本设置为“基于”AppDebug.xcconfig。然后在 AppDebug.xcconfig 中添加 DEBUG_VARIABLE = 1。#if defined (DEBUG_VARIABLE) NSLog(@"this is a test");#endif 无法打印任何内容。关于 xcconfig 文件的工作原理,我一定遗漏了一些东西。 将其添加为预处理器定义:GCC_PREPROCESSOR_DEFINITIONS = DEBUG_VARIABLE=1 $(inherited)【参考方案2】:

我会编辑架构并添加一个预构建的 shell 脚本来设置正确的变量。 添加脚本时,您可以确定从哪个目标获取定义。

【讨论】:

【参考方案3】:

可能会使用“预处理器宏”构建设置将定义添加到要启用调试的目标和/或调试/发布构建配置。

在您的情况下,您可以双击值列,然后单击“+”以添加新宏。 marco 将是“FOOMODULE_DEBUG_LEVEL=1”,这将导致编译器 -DFOOMODULE_DEBUG_LEVEL=1

【讨论】:

嗨 Mattias,添加预处理器宏似乎不会影响我包含在主项目中的子项目(即静态库)的构建 这在静态库中不可见。你能告诉我可能是什么原因吗? 您正在构建静态库或与已构建的静态库链接? -D 宏仅在编译时使用。【参考方案4】:

解决方案

1) 目标 > 构建设置 > 预处理器宏。将环境变量设置为目标的预处理器def(似乎必须是目标而不是项目),例如DEBUG_VARIABLE=1

2) 项目 > 构建阶段 > 添加构建阶段。然后在运行脚本中导出变量: 导出 DEBUG_VARIABLE

所有子项目现在都选择这个环境变量。

我认为理想的做法是还使用 Justin 的建议,即在一个位置定义所有预处理器宏的 .xcconfig 文件,以便于编辑它们。对于我的生活,我无法完成这项工作。如果我把它放在 .xcconfig 文件中: GCC_PREPROCESSOR_DEFINITIONS = DEBUG_VARIABLE=1 $(继承) 然后基于此配置进行调试和/或发布构建,永远不会设置 DEBUG_VARIABLE 环境变量。

【讨论】:

更新:如果我创建一个新项目,然后添加一个 .xcconfig 文件,如上所述,环境变量已设置,#ifdefs 在此变量的代码中工作。如果我在我正在处理的项目中遵循完全相同的程序,它就行不通。我想我的主要项目的项目设置一定有什么特别之处……但不知道是什么! 我想我在目标中有一个设置覆盖了项目设置。我删除了构建中的所有预处理器宏,现在 .xcconfig 文件似乎可以工作。除非我进行清理,否则并不总是在构建中获取更改。一定要记得这样做! 尝试使用此建议,但是我在项目级别没有任何构建阶段。将任何运行脚本添加到目标级别(我有构建阶段)将无济于事,因为在构建子项目之前它们不会运行。 项目设置中没有构建阶段。它在目标设置中。

以上是关于子项目的 Xcode 环境变量的主要内容,如果未能解决你的问题,请参考以下文章

xcode环境变量设置(转载)

在 Xcode 构建阶段运行脚本中设置全局环境变量

JAVA设置环境变量的目的

Xcode常用环境变量与常见使用场景

JDK--环境变量配置目的?

Xcode 8:在 Active Compilation Conditions 中自定义环境变量