首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在GNU生成文件中对环境变量进行建模

如何在GNU生成文件中对环境变量进行建模
EN

Stack Overflow用户
提问于 2018-12-12 15:15:42
回答 1查看 210关注 0票数 0

文件名:"dev

代码语言:javascript
复制
export CFLAGS="-g -O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE"
export CXXFLAGS="-g -O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE"

在编译我的项目之前,我使用了源代码开发,因此echo $CFLAGS $CXXFLAGS将是我分配给它的值。

但是如何更改Makefile中的环境变量呢?我试过了,但失败了。

代码语言:javascript
复制
[root@centos-linux-10 make]# cat Makefile 
all:
    export CFLAGS="-O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE"
    export CXXFLAGS="-O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE"

    @echo $(CFLAGS)
    @echo $(CXXFLAGS)

[root@centos-linux-10 make]# make 
export CFLAGS="-O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE"
export CXXFLAGS="-O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE"
-g -O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE
-g -O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# 

经过几次尝试,我得到了this.In makefile我响应了CFLAGS和CXXFLAGS,它们是新的值,在做完之后,为什么它的价值会返回?

代码语言:javascript
复制
[root@centos-linux-10 make]# cat Makefile 
export CFLAGS="-O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE"
export CXXFLAGS="-O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE"

all:

    @echo $(CFLAGS)
    @echo $(CXXFLAGS)

[root@centos-linux-10 make]# echo $CFLAGS
-g -O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# echo $CXXFLAGS
-g -O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# 
[root@centos-linux-10 make]# make
-O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE
-O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# 
[root@centos-linux-10 make]# echo $CFLAGS
-g -O2 -Wall -std=gnu99 -fno-strict-aliasing -D_GNU_SOURCE
[root@centos-linux-10 make]# echo $CXXFLAGS
-g -O2 -Wall -fno-strict-aliasing -D_GNU_SOURCE
EN

回答 1

Stack Overflow用户

发布于 2018-12-12 21:06:50

首先,如@JonathanLeffler所述,菜谱的每一行都在自己的shell中运行。每次shell退出时,它都会忘记它的所有变量(这样做有一些非常好的安全理由)。因此,不能在下一行访问菜谱一行中的变量集。解决这一问题的一个更常见的方法是只使用一行作为您的菜谱。我应该指出,您还在使用$(CFLAGS)尝试引用bash变量。Make将在将$(CFLAGS)传递给bash之前将其扩展到其内部变量,因此在您的示例中,甚至没有使用bash变量。

为了说明:

代码语言:javascript
复制
foo:
    @SOMEVAR=hello; \
     echo $@:$$SOMEVAR

bar:
    @SOMEVAR=hello;
    @echo $@:$$SOMEVAR

MAKEVAR:=goodbye
foobar:
    @echo "$@:$(MAKEVAR)"

然后你得到:

代码语言:javascript
复制
tmp> make foo bar foobar
foo:hello
bar:
foobar:goodbye

注意foo菜谱第一行末尾的';‘和'\’。\将两个recpies行连接为一个,;告诉bash作为两个单独的命令运行。还请注意第二行缺少@符号,因为bash不理解@。最后,在foobar配方中,在make变量前面只有一个$,这意味着它由makefile展开,但是在foobar变体前面有两个$$(在传递给bash之前扩展到单个$ )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53746070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档