【问题标题】:Writing makefile to compile several binaries编写 makefile 编译多个二进制文件
【发布时间】:2024-04-10 19:55:02
【问题描述】:

我正在尝试编写一个 Makefile 来编译具有以下名称的 87 个文件: 文件1.c,文件2.c 文件3.c ....文件87.c

我正在尝试将它们编译为具有名称的单独二进制文件: 文件1,文件2,文件3 ....文件87

在 Makefile 中,我需要为每个变量定义以下变量。 这是我原来的样子

FILE1 = file1
$(FILE1)_SRC := \
        mydir/file1.c \
        mydir/another.c

$(FILE1)_CFLAGS := `pkg-config --cflags glib-2.0`
$(FILE1)_LDFLAGS := -L. `pkg-config --libs glib-2.0`

FILE2 = file2
$(FILE2)_SRC := \
        mydir/file2.c \
        mydir/another.c

$(FILE2)_CFLAGS := `pkg-config --cflags glib-2.0`
$(FILE2)_LDFLAGS := -L. `pkg-config --libs glib-2.0`

在 Makefile 的末尾,我还需要存储二进制文件的名称

binaries = $(FILE1) $(FILE2) ...... $(FILE87)

我在 make 中探索了循环并定义了指令,但我不明白如何以一种不繁琐的方式巧妙地做到这一点。请注意,它们的 CFLAGS 和 LDFLAGS 都是相同的。

非常欢迎任何用于编写 Makefile 的输入或替代方法。

我是根据下面 seldon 的回答写的,但这给出了一个错误

SRCS = $(wildcard mydir/*.c)
TGTS = $(SRCS:%.c=%)

CFLAGS  = $$(pkg-config --cflags glib-2.0)
LDFLAGS = -L.
LDLIBS  = $$(pkg-config --libs glib-2.0)

all: $(TGTS)
    @echo $(SRCS)
    @echo $(TGTS)

$(TGTS) : % : %.o another.o

#clean:
 #   rm -f $(TGTS) *.o

#.PHONY: all clean

$ make
cc $(pkg-config --cflags glib-2.0)   -c -o mydir/another.o mydir/another.c
make: *** No rule to make target `another.o', needed by `mydir/another'.  Stop.

来源:

另一个.c

# include <stdio.h>
# include <stdlib.h>

void print_string(const char * file_name, int lineno, const char * func_name) {

    printf("%s %d %s\n", file_name, lineno, func_name);

}

file01.c

int main() {

    print_string(__FILE__, __LINE__, __func__);
}

任何帮助表示赞赏。

【问题讨论】:

  • 你需要binaries做什么?
  • @Beta,我需要构建它们。谢谢。
  • 读取错误! make 抱怨你没有告诉它如何构建another.o。然后查看您的 Makefile。 another.o 出现的唯一行是静态模式规则$(TGTS) : % : %.o another.o。如果${TGTS}中的每个目标都不依赖another.o,那就把它拿出来! (只是依赖,不是整行!)
  • @bobbogo 实际上从我发布的每个文件的来源*.c 需要另一个.c 进行编译。

标签: build makefile build-process gnu-make


【解决方案1】:

如果所有程序的变量都相同,您可以使用如下静态模式规则:

SRCS = $(wildcard file*.c)
TGTS = $(SRCS:%.c=%)

CFLAGS  = $$(pkg-config --cflags glib-2.0)
LDFLAGS = -L.
LDLIBS  = $$(pkg-config --libs glib-2.0)

all: $(TGTS)

$(TGTS) : % : %.o another.o

clean:
    rm -f $(TGTS) *.o

.PHONY: all clean

【讨论】:

  • 你能看看错误吗?我还发布了来源。谢谢。
  • 静态模式规则绝对是要走的路,耶! (真的不喜欢 wildcard 调用,嘘!)
  • 使它 $(wildcard mydir/file*.c) 明确地从 $(TGTS) 中排除 another.c$(TGTS) : % : %.o mydir/another.o 所以 mydir/another.c 被编译成一切。如果您想将 Makefile 放在与源文件不同的目录中,路径就变得很重要。
  • @seldon 我会试试的,谢谢。还有这条线在做什么? $(TGTS) : % : %.o mydir/another.o你能解释一下代码告诉/做什么吗?为什么要清空 %?
  • @bobbogo 你能告诉我你对使用静态模式规则有什么想法吗?