如何将make目标用作makefile中的变量?
我正在尝试为一个项目设置一个简单的makefile,其中我有10个子项目。每个子项目都位于名为如何将make目标用作makefile中的变量?,makefile,Makefile,我正在尝试为一个项目设置一个简单的makefile,其中我有10个子项目。每个子项目都位于名为1、2、3的目录中10。在每个目录中,我都有一个*.c文件。我已经知道如何编译所有的*.c文件,但是我不知道如何使用make目标只编译一个特定的文件。以下是我目前掌握的情况: all: some code $(@): $(@).c gcc -o $(@)/$(@) $(@)/$(@).c 如果有帮助,这是我的通用目录结构: ├── 1 │ └── 1.c ├── 2 │ └─
1
、2
、3
的目录中<代码>10。在每个目录中,我都有一个*.c
文件。我已经知道如何编译所有的*.c
文件,但是我不知道如何使用make目标只编译一个特定的文件。以下是我目前掌握的情况:
all:
some code
$(@): $(@).c
gcc -o $(@)/$(@) $(@)/$(@).c
如果有帮助,这是我的通用目录结构:
├── 1
│ └── 1.c
├── 2
│ └── 2.c
├── 3
│ └── 3.c
└── makefile
BINARIES=1/12/23/3。。。
全部:$(二进制文件)
一些代码
$(二进制文件):%:%.c
gcc-o$(@)$<
可能离你要找的东西很近。
$(二进制文件):%:%.c
是一个静态模式规则。要了解其行为,您可以阅读GNU make手册的第4.12节静态模式规则。您的意思是您想通过调用“make 2”或调用“make 2/2”来构建2/2
?我应该更清楚地说明这一点。我想通过调用make2
来构建2/2
;您正在尝试创建一个规则,其目标是已存在的其他对象的名称。这是可以做到的,但我敦促您重新考虑设计。make 2
的问题在于,make会将其解释为在需要时重新构建2
目录,这不是您想要的。此外,作为make目标的目录是一个非常特殊的情况:make将目标的最后修改日期与其先决条件的最后修改日期进行比较,以确定是否需要重建。这对于常规文件来说是好的,但对于目录来说则不行,因为最后的修改日期不是它们内容的最后修改日期……所以更好的设计应该是遵循all:somecode1:1.cgcc-o1/11/1.c2:2.cgcc-o2/22/2.c3:3.cgcc-o3/3的思路3/3.c
完美!做了一些调整,看起来这正是我需要的。
BINARIES = 1/1 2/2 3/3...
all: $(BINARIES)
some code
$(BINARIES): %: %.c
gcc -o $(@) $<