如何解决如何通过Linux环境为gcc设置自定义预定义宏,以避免一直传递它们
我有几个项目,其中使用了许多自定义宏。例如,
//prog.c
#include <stdio.h>
#ifdef DBG_LEVEL_1
#define P(d) printf("%s:%d\n",#d,d);
#else
#define P(...)
#endif
#ifdef INLINE
#define INL static inline
#else
#define INL
#endif
INL void func_Sqr(int a)
{
printf("sqr(a):%d\n",a*a);
}
int main()
{
int a = 3;
P(a);
func_Sqr(a);
return 0;
}
我用几种方法进行编译,
gcc prog.c
gcc -DINLINE prog.c
gcc -DDBG_LEVEL_1 prog.c
gcc -DDBG_LEVEL_1 -DINLINE-DINLINE prog.c
是否可以通过环境变量将这些宏设置为默认启用?
我们可以通过创建一个设置这些宏的makefile来解决此问题。 但是我想知道是否有任何与Linux环境相关的解决方案
解决方法
是否可以通过环境变量将这些宏设置为默认启用?
通常,没有没有。 Gcc参数不受环境变量(可能是DEPENDENCIES_OUTPUT
除外)的影响。
我建议在命令周围编写一个小的包装函数,例如bash函数:
wgcc() {
gcc "${GCCARGS[@]}" "$@"
}
然后执行:
GCCARGS+=(-DA=1 -DB=2)
wgcc something.c
琐事难做,易于理解和维护,并与其他团队成员进行交流,易于实现和共享。令人惊讶的haisenbug易于跟踪-wgcc
是与gcc
不同的唯一名称。您仍然可以使用gcc() { command gcc "${GCCARGS[@]}" "$@"; }
或通过创建/usr/local/bin/gcc
文件来覆盖原始命令,从而使其更加混乱。
但是!您可以而且我都强烈建议您不要这样做,因为这会使其他人感到困惑并且难以维护。您可以使用COMPILER_PATH环境变量来覆盖编译器工具并提供自定义选项。步骤:
- 创建一个临时目录
- 在该目录中,将gcc的所有子程序链接到其常规前缀,除了您要修改其行为的工具(例如
cc1
)。 - 然后使用该脚本创建
cc1
作为脚本,它将调用原始的cc1
,但将使用某些环境变量来传递额外的参数。 - 然后将路径导出为COMPILER_PATH,以便gcc将其提取。
在带有gcc10.0.1的archlinux上,我做了:
mkdir /tmp/temp
cd /tmp/temp
for i in /usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/{cc1plus,collect2,lto-wrapper,lto1}; do ln -vs "$i"; done
printf "%s\n" '#!/bin/sh' '/usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/cc1 $GCCARGS "$@"' > cc1
chmod +x cc1
export COMPILER_PATH=/tmp/temp
之后,您可以:
export GCCARGS=-DA=1
gcc -xc - <<<'int main() { printf("A=%d\n",A); }'
./a.out
> A=1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。