[英]How do I use automatic variables in makefile conditionals?
总结问题
我想更改单个源文件的编译,如下所示:
%.exe: %.c
ifeq($@, cannon.exe)
$(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^ $(inc_flags) $(LDLIBS)
else
$(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^
endif
但它不起作用!
描述你尝试过的东西
我曾尝试让 bash 条件涉及,但我无法弄清楚,我不应该混合 bash 和 make。
这是完整的 Makefile:
CC := gcc
CFLAGS := -g -Wall -Wextra
LDLIBS := -lm
inc_dirs := math.h stdio.h
inc_flags := $(addprefix -I,$(inc_dirs))
executable:=cannon.exe
source:=$(executable:%.exe=%.cpp)
.DELETE_ON_ERROR:
all: $(executable)
%.exe: %.c
ifeq($@, cannon.exe)
$(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^ $(inc_flags) $(LDLIBS)
else
$(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^
endif
clean:
rm -f $(executable:%.exe=%)
事实证明,如果你想为某个源文件做一个特殊情况,你可以明确定义它的配方! Make 将显式接管隐式规则。 下面的完整工作代码。
CC := gcc
CFLAGS := -g -Wall -Wextra
LDLIBS := -lm
inc_dirs := math.h stdio.h
inc_flags := $(addprefix -I,$(inc_dirs))
executable:=cannon.exe
source:=$(executable:%.exe=%.cpp)
# no deps so no objs
.DELETE_ON_ERROR:
all: $(executable)
%.exe: %.c
$(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^
cannon.exe: cannon.c
$(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^ $(inc_flags) $(LDLIBS)
clean:
rm -f $(executable:%.exe=%)
一个更好/更完美的解决方案是使用构造变量名称,如下所示:
CC := gcc
CFLAGS := -g -Wall -Wextra
LDLIBS := -lm
inc_dirs := math.h stdio.h
cannon_CFLAGS := $(addprefix -I,$(inc_dirs))
executable := cannon.exe
source := $(executable:%.exe=%.cpp)
# no deps so no objs
.DELETE_ON_ERROR:
all: $(executable)
%.exe: %.c
$(CC) $(CFLAGS) $($*_CFLAGS) -o $@ $^
clean:
rm -f $(executable:%.exe=%)
笔记:
您的规则应始终创建与 makefile 中的目标相同的名称。 将目标命名为foo.exe
是不对的,但是 build 命令会创建一个名为foo
的文件。 如果要创建一个名为foo
的文件,则 makefile 目标应命名为foo
。 基本上,您应该始终创建包含在 make 变量$@
中的文件。
您拥有的目录是否真的被命名为math.h
和stdio.h
? 这……很奇怪。 而且极有可能造成严重的问题。 如果math.h
和stdio.h
是文件,则不应将它们与-I
添加,因为-I
采用目录名称,在其中搜索文件文件。 它不需要文件名。
如果您确实创建了名为math.h
和stdio.h
的本地文件,那也是一个非常糟糕的主意:这些是标准头文件名,除非您真的知道自己在做什么,否则您不应该自己重新声明它们。
如果您没有创建这些文件,而只是尝试在文件中包含标准头文件math.h
和stdio.h
,那么您绝对不需要在编译行中添加任何标志。 只需包括它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.