c - 在 Makefile 中,是否可以创建具有通用依赖项的通用规则?

标签 c makefile

我想做这样的事情:

$(BIN_NAME): $(ODIR)/$@.o | $(BDIR)

在这个 Makefile 中:

.PHONY: clean all
.DEFAULT_GOAL := all

BIN_NAME=example1 example2

CC=gcc

IDIR=inc
LDIR=lib
ODIR=obj
BDIR=bin

CFLAGS=-Werror -Wall -pedantic
INCS=-I$(IDIR)
LIBS=

SRCS=$(wildcard *.c)
OBJS=$(patsubst %.c,$(ODIR)/%.o,$(SRCS))
BINS=$(patsubst %,$(BDIR)/%,$(BIN_NAME))

$(BDIR) $(ODIR):
    @mkdir -p $@

$(ODIR)/%.o: %.c $(DEPS) | $(ODIR)
    @$(CC) -c -o $@ $< $(CFLAGS) $(INCS)

$(BIN_NAME): $(ODIR)/$@.o | $(BDIR)
    @gcc -o $@ $^ $(CFLAGS) $(LIBS)

all: $(BIN_NAME)

clean:
    @rm -rf $(ODIR) $(BDIR)

但是$@自动变量好像不能这么用。有什么方法可以创建一个通用规则,我可以用它来创建多个二进制文件,主要使用相同的源文件,唯一的异常(exception)是单独的 .c 文件(与目标二进制文件同名)?

最佳答案

以下是通用规则的示例:

%: %.cpp
    g++ -o $@ $^ -std=c++17 -lpthread

如果你调用上面的 Makefile 说,make testprog , 它将把上面的规则翻译成:

testprog: testprog.cpp
    g++ -o testprog testprog.cpp -std=c++17 -lpthread

GNU make 为您提供了许多附加功能,您可以使用这些功能创建相当复杂的通用规则。注意 $@代表目标的名称,而 $^表示依赖项列表。您也可以使用 $<引用列表中的第一个依赖项。 %是指示通过替换实际运行时值来生成规则的占位符。

关于c - 在 Makefile 中,是否可以创建具有通用依赖项的通用规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35109429/

相关文章:

我可以在 C 程序中拦截正常的 stdio 调用,做一些工作然后调用原始的吗?

c++ - 从文件中读取随机字符串时出错

c - Memcpy 复制反向数组的技巧

Calloc/Malloc 并经常释放或释放太大的空间?

c - 参数与原型(prototype) : struct in_addr 不兼容

testing - Automake:将本地便利行为添加到 "make check"

linux - 使内核模块 makefile 识别源的绝对路径?

c - 如何在 C 中进行管道传输

bash - Makefile - 为什么读取命令不读取用户输入?

c - Linux Makefile.am 错误 "undefined reference to"