Make:变量赋值
Posted
技术标签:
【中文标题】Make:变量赋值【英文标题】:Make: Variable assignment 【发布时间】:2019-03-06 12:54:53 【问题描述】:我在访问包含的其他 makefile 中的变量时遇到了这个问题。
我有 test.mak 有变量 LIBS32 := $(TESTLIBS)/$(NEW_PLAT32) 我已将 test.mak 包含在其他 makefile 中,并尝试将该变量分配给其中一个目标。
extlib32: EXTLIBS = $(LIBS32)
extlib64: EXTLIBS = $(LIBS64)
EXTLIBS 的预期值应该是 '/home/testlib/extlibs/Linux' 。但是在这里,当我打印 EXTLIBS 时,我看到的值是 '/home/testlib/extlibs/'
注意:- 当我打印 LIBS 时,我可以看到预期的内容。但是当我分配给 EXTLIBS 并尝试使用它时.. 我可以看到“Linux”这个词不见了。
谢谢!
【问题讨论】:
【参考方案1】:您将EXTLIBS
设置为目标extlib32
的target-specific variable。此类变量是非全局的,它们的值仅在目标配方和目标的先决条件中可用,而不是全局可用(这就是 $(info $(EXTLIBS))
不打印预期值的原因)。
要打印它的值,您需要从目标extlib32
的配方中打印它,例如:
extlib32:
@echo "EXTLIBS=$EXTLIBS"
如果 extlib32
和 extlib64
是 .PHONY
构建某些东西的目标,那么您最初的特定于目标的分配应该传播到依赖项并在它们的配方中可用。您只是无法从全局 makefile 范围打印它的值。
要在 32 位和 64 位模式(以及发布和调试)下构建一个 makefile,您需要以不同的方式构建它并为每种构建模式分别调用 make
。示例:
# User can overrided capitalized variables. E.g.
# make BUILD=release MODE=32 LDLIBS=-lrt
BUILD := debug
MODE := 64
build_dir := $BUILD/$MODE
ldlibs.32 := my-32-bit-libs
ldlibs.64 := my-64-bit-libs
ldlibs := $ldlibs.$MODE $LDLIBS
all :
@echo "build_dir=$build_dir"
@echo "ldlibs=$ldlibs"
用法示例:
$ make
build_dir=debug/64
ldlibs=my-64-bit-libs
$ make BUILD=release MODE=32
build_dir=release/32
ldlibs=my-32-bit-libs
Another example for debug/release compiler options.
【讨论】:
嗨马克西姆,我只是用 $(info .$(EXTLIBS)) 打印来检查值....顺便说一句,我想在我的目标中使用该变量..我该如何使用它?我上面做的作业不正确吗? @santosh 然后就做EXTLIBS := $(LIBS)
(没有别的就行了)。
嗨,Maxim,LIBS 值将根据 32 位或 64 位构建而改变。抱歉,如果我的问题不清楚...为了清楚起见,我正在更新我的问题。
@santosh 已为您更新。
嗨 Maxim,感谢您的更新...在我的情况下,我该如何解决这个问题.. 基本上要求是如果我们正在运行 32 位构建,那么 EXTLIBS 值应该分配给 $(LIBS32),如果我们正在运行 64 位构建,那么 EXTLIBS 值应该分配给 $(LIBS64).. 这就是为什么我有上面单独的 32 位和 64 位目标,但没有按预期工作。我们如何才能使其全球化...请您帮忙解决这个问题吗?以上是关于Make:变量赋值的主要内容,如果未能解决你的问题,请参考以下文章