我有一个makefile:
SOURCES= helloworld.c
ifeq ($(OSNAME), linux)
# Object files needed to create library
OBJECTS=$(SOURCES:%.c=%.o)
endif
# Windows Microsoft C/C++ Optimizing Compiler Version 12
ifeq ($(OSNAME), win32)
OBJECTS=$(SOURCES:%.c=%.obj)
endif
#OBJECTS=$(SOURCES:%.c=%.o) #without this line print won't output anything
print:
@echo $(OBJECTS)
当我调用make print(在linux和macOS上)时,它会打印空行,除非我取消注释#OBJECTS = $(SOURCES:%。c =%。o)行。
为什么会这样?并非所有变量都是全局的吗?
答案 0 :(得分:2)
提示1): 您可以使用以下命令打印出make中的每个变量:
SOURCES= helloworld.c
$(info sources: $(SOURCES))
$(info osname: $(OSNAME))
$(info os: $(OS))
提示2)
从linux中的输出中可以看出它返回:
sources: helloworld.c
osname:
os:
你可以看到OSNAME根本没有在linux上设置,所以你的支票ifeq ($(OSNAME), linux)
总是会失败!
要获取操作系统信息,请查看此链接:
答案 1 :(得分:0)
我对你的Makefile进行了测试,但没有用。虽然它有可能在一般情况下起作用,但它似乎与测试OS的其他示例不同。因此,我很想建议您的条件,至少对于我测试的Linux,不会评估为true,因此该变量未设置。
这是一个似乎适用于Linux的重写示例:
SOURCES= helloworld.c
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
# Object files needed to create library
OBJECTS=$(SOURCES:%.c=%.o)
endif
# Windows Microsoft C/C++ Optimizing Compiler Version 12
ifeq ($(OS),Windows_NT)
OBJECTS=$(SOURCES:%.c=%.obj)
endif
print:
@echo $(OBJECTS)
输出(对我来说是Linux):
db@vm1:~/projects/here> make
helloworld.o
这个例子主要受到以下要点的启发: