gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:22 25 4
gpt4 key购买 nike

我想做这样的事情:

$(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com