我如何在不改变Xcode项目的情况下#ifdef环境变量?



我想检测Xcode设置之外的环境变量。我可以这样做,在运行时检查环境,如指定检测iOS应用程序在调试器中运行,但有办法做到这一点与这样的预处理宏?

#ifdef USER_GRADHA
    // do some stuff
#else
    // do other stuff
#endif

设置了我的环境变量,但是它没有到达.m文件的编译阶段。我希望在不修改项目的预处理器宏变量的情况下完成此任务,因为我希望对每个用户的编译是不同的,而无需他们修改它。

No。编译是一个非常明确的过程,不依赖于外部环境。我所知道的唯一方法是通过Xcode中的源树偏好来区分编译,这是为了让用户在不同机器上的不同位置保留源树,但构建设置是相同的(因为它可以参考首选项中的源树位置集)。

首先,如果您可以使用普通字符串而不是预处理器变量,请不要忘记getenv将环境变量读入字符串。例如,

#include <stdlib.h>
char *ug = getenv("USER_GRADHA");
if (ug) {
  //use the environment variable here
} else {
  //it's NULL == undefined env variable (in all likelihood)
}

如果需要使用预处理器变量,shell可以在编译器调用时使用posix标准的-D或-U标志设置一个预处理器变量。不幸的是,简单的

gcc -DUSER_GRADHA=$USER_GRADHA file.c

可能会给您带来麻烦,因为如果环境变量未定义,您将有一个空白但已定义的预处理器变量。所以使用shell条件语句可能是最简单的,比如

if [ $USER_GRADHA ] ; then ug="-D$USER_GADHA"; else ug="-U$USER_GRADHA"; fi
c99 $ug file.c

这很容易在makefile或许多其他类型的钩子中实现,以执行任意shell代码进行编译。

最后,总是有Autotools,它是专门为这个基于环境信息编译的问题而设计的。你问的是Xcode,所以Autotools可能不适合你的工作流程(很多人不了解Autotools并立即忽略它),但如果你想要它就在那里。

相关内容

最新更新