Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将make目标用作makefile中的变量?_Makefile - Fatal编程技术网

如何将make目标用作makefile中的变量?

如何将make目标用作makefile中的变量?,makefile,Makefile,我正在尝试为一个项目设置一个简单的makefile,其中我有10个子项目。每个子项目都位于名为1、2、3的目录中10。在每个目录中,我都有一个*.c文件。我已经知道如何编译所有的*.c文件,但是我不知道如何使用make目标只编译一个特定的文件。以下是我目前掌握的情况: all: some code $(@): $(@).c gcc -o $(@)/$(@) $(@)/$(@).c 如果有帮助,这是我的通用目录结构: ├── 1 │   └── 1.c ├── 2 │   └─

我正在尝试为一个项目设置一个简单的makefile,其中我有10个子项目。每个子项目都位于名为
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 $(@) $<