如何将用户定义的宏传递给xcodebuild?

如何将用户定义的宏传递给xcodebuild?,c,xcode,macros,xcodebuild,C,Xcode,Macros,Xcodebuild,我通过命令行中的xcodebuild构建我的项目。不是在xCode中。我想把一些marc传递给项目,这样它就能影响代码。例如下面的代码: #if (API_TYPE == 1) #define URL_API @"https://dapi.xxx.com/1.1/" #elif (API_TYPE == 2) #define URL_API @"https://tapi.xxx.com/1.1/" #elif (API_TYPE == 3) #define URL_API @"htt

我通过命令行中的xcodebuild构建我的项目。不是在xCode中。我想把一些marc传递给项目,这样它就能影响代码。例如下面的代码:

#if (API_TYPE == 1)
  #define URL_API @"https://dapi.xxx.com/1.1/"
#elif (API_TYPE == 2)
  #define URL_API @"https://tapi.xxx.com/1.1/"
#elif (API_TYPE == 3)
  #define URL_API @"https://api.xxx.com/1.1/"
#else
  #error "API_TYPE value error! should be only value 1,2,3 !"
#endif 
我想在代码文件之外传递API_类型的定义。例如通过xcodebuild命令。 但它不是这样工作的:

xcodebuild -sdk xxx -target xxx SYMROOT=${XCSYMROOT} API_TYPE=${APITYPE}
#define DEFAULT_API_TYPE 1

#ifdef API_TYPE
  #define REAL_API_TYPE API_TYPE
#else
  #define REAL_API_TYPE DEFAULT_API_TYPE
#endif
API_类型的值未更改。但符号根的值已更改。
那么,如何实现将值传递给外部的API_类型呢

您使用的命令行设置有效地设置环境变量,至少在Xcode的构建环境中是如此。但是,构建环境不会传递到编译器的预处理器中,正如设置shell环境变量不会使该环境变量在预处理器中可见一样

要使其在预处理器中可见,请在项目或所需特定目标的“预处理器宏生成”设置中添加一个条目。条目的格式应为“FOO=$(FOO)”。Xcode将其作为“-DFOO=来自环境的FOO值”传递给编译器


编辑预处理器宏设置时,请确保您正在为所有配置(或您不想为所有配置设置的配置)编辑它。

我知道这是一篇老文章,但为什么不使用:

xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$GCC_PREPROCESSOR_DEFINITIONS API_TYPE=1'
如果您想让它选择性地覆盖现有的应用程序内定义,只需编写如下代码:

xcodebuild -sdk xxx -target xxx SYMROOT=${XCSYMROOT} API_TYPE=${APITYPE}
#define DEFAULT_API_TYPE 1

#ifdef API_TYPE
  #define REAL_API_TYPE API_TYPE
#else
  #define REAL_API_TYPE DEFAULT_API_TYPE
#endif

我可以得到API_类型的定义。但我不能改变它的定义值。例如SYMROOT。对不起,我不理解您的评论。在预处理器宏生成设置中输入文本“API\U类型=$(API\U类型)”时是否有问题?我在xcode项目设置的调试配置中输入文本“API\U类型=0调试=1”。但在使用xcodebuild的命令行中,例如下面的命令:“APITYPE=2 xcodebuild-sdk xxx-target xxx SYMROOT=${Xcsymoot}API_TYPE=${APITYPE}”,它喜欢值2没有传递给xcodebuid命令进行构建。API_TYPE=1值会影响生成结果。在命令行中,使用“xcodebuild-sdk xxx-target xxx SYMROOT=xxx API_TYPE=xxx”,其中每个“xxx”都将替换为所需的值。例如,使用“API_类型=2”。不要使用“API_TYPE=${APITYPE}”。在Xcode项目中,必须设置预处理器宏生成设置。您应该为此使用Xcode应用程序。您必须找到预处理器宏生成设置,并且必须添加一个显示“API_类型=$(API_类型)”的条目(注意:括号,而不是大括号)。不要在预处理器宏生成设置的一行中输入“API_TYPE=0 DEBUG=1”。如果你想设置两个项目,你必须使用两行。这可以部分解决我的问题。我可以从环境中获取API_类型的值。但当我在Xcode中构建它时,它无法识别“$(API_类型)”,因为它是由Environment使用的。