Build 编写makefile以编译多个二进制文件

Build 编写makefile以编译多个二进制文件,build,makefile,build-process,gnu-make,Build,Makefile,Build Process,Gnu Make,我正在尝试编写一个Makefile来编译87个具有以下名称的文件: file1.c,file2.c file3.c。。。。文件87.c 我正在尝试将它们编译成具有名称的单独二进制文件: 文件1、文件2、文件3。。。。文件87 在Makefile中,我需要为它们中的每一个定义以下变量这是我最初拥有的 FILE1 = file1 $(FILE1)_SRC := \ mydir/file1.c \ mydir/another.c $(FILE1)_CFLAGS :=

我正在尝试编写一个Makefile来编译87个具有以下名称的文件: file1.c,file2.c file3.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的替代方法

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

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.
资料来源:

另一个

# 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);

}

非常感谢您的帮助。

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

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

你需要
二进制文件做什么?@Beta,我需要构建它们。谢谢。阅读错误!你没有告诉它如何构建另一个.o
,这会让人抱怨。然后看看你的Makefile。唯一出现
other.o
的行是静态模式规则
$(TGTS):%:%.o other.o
。如果
${TGTS}
中的每个目标不依赖于另一个.o,则将其取出!(只是依赖项,不是全部!)@bobbogo实际上来自我发布的源代码,每个文件*.c都需要另一个.c进行编译。你能看看错误吗?我还发布了消息来源。谢谢。静态模式规则绝对是最好的选择,耶!(不过我真的不喜欢通配符调用,Boo!)让它
$(通配符mydir/file*.c)
$(TGTS)
,和
$(TGTS):%:%.o mydir/other.o
中显式排除
另一个.c
,因此
mydir/other.c
被编译到所有内容中。如果您想将Makefile放在与源文件不同的目录中,路径就变得很重要了。@seldon我会试试的,谢谢。这条线在做什么<代码>$(TGTS):%:%.o mydir/other.o你能解释一下代码告诉/做什么吗?为什么是空的%?@bobbogo您能告诉我使用静态模式规则的想法吗?
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