2011-09-26 69 views
12

我目前的Xcode iOS项目使用了许多静态库。静态库中的不同代码模块具有各种级别的调试,我可以使用该模块中的#define来打开/关闭。子项目的Xcode环境变量

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

所以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

也许可以使用“Preprocessor macros”构建设置将定义添加到目标和/或调试/发布构建配置,以便在其中启用调试。

在你的情况下,你会双击值列,然后点击“+”添加一个新的宏。 marco会是“FOOMODULE_DEBUG_LEVEL = 1”,这应该导致-DFOOMODULE_DEBUG_LEVEL=1给编译器。

+0

您好Mattias,添加预处理器宏似乎并没有影响我在主项目中包含的子项目(即静态库)的构建 – tomj

+0

这在静态库中是不可见的。你能告诉我可能是什么原因吗? – applefreak

+0

您建立一个静态库或与已建立的静态库链接? -D宏仅在编译时使用。 –

0

您可以通过创建xcconfig文件然后引用或在整个项目中对其进行引用来完成此操作,而无需多个定义。所以,你可以应用Mattias的建议,然后在xcconfig中定义预处理器defs。那么你有一个文件需要改变(如果你需要在pch文件中有这些defs,那么这个文件有单独的设置)。

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

+0

感谢您的建议, – tomj

+0

我将AppDebug.xcconfig添加到我的项目中,并在项目信息页面中将我的调试和发布版本设置为基于AppDebug.xcconfig。然后在AppDebug.xcconfig中添加DEBUG_VARIABLE = 1. #if定义(DEBUG_VARIABLE)NSLog(@“this is a test”);#endif无法打印任何东西。我必须错过xcconfig文件的工作方式。 – tomj

+0

添加它作为预处理器定义:'GCC_PREPROCESSOR_DEFINITIONS = DEBUG_VARIABLE = 1 $(继承)' – justin

-1

解决方案

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

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

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

我认为理想的做法是使用Justin的建议,即将一个.xcconfig文件与所有在一个地方定义的预处理器宏配合使用,以便编辑它们。对我而言,我无法完成这项工作。如果我把它放在.xcconfig文件中: GCC_PREPROCESSOR_DEFINITIONS = DEBUG_VARIABLE = 1 $(继承) 然后基于DEBUG_VARIABLE环境变量的DEBUG_VARIABLE环境变量设置调试和/或发布版本。

+0

更新:如果我创建一个新项目,然后添加一个.xcconfig文件如上所述环境变量设置和#ifdefs在代码中工作这个变量。如果我在项目中按照完全相同的步骤进行操作,则不起作用。我想我的主要项目的项目设置必须有一些特殊的东西......不知道该怎么做! – tomj

+0

我认为我在目标设置中覆盖了项目设置。我删除了构建中的所有预处理器宏,现在.xcconfig文件似乎工作。除非我干净整洁,否则修改并不总是在版本中找到。必须记住这样做! – tomj

+1

试图使用此建议,但是我没有任何项目级别的构建阶段。将任何运行脚本添加到目标级别(我有构建阶段)将无济于事,因为它们在子项目构建之前未运行。 – DrMickeyLauer

0

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