makefile编译倍数目标

时间:2014-10-23 15:26:22

标签: c makefile multiple-files

这是我在这个论坛上的第一篇文章。很抱歉打扰,但我一直在寻找类似的东西,奇怪的是我无法找到它。这就是问题所在。 我有三个(主要)文件,没有标题,我想立即编译它们(如果我只是键入" make")或逐个编译(如果我指定文件的名称没有扩展名) 。所以我构建了我的makefile,但命令

中出错了
$(TARGETS): $(BUILDS_DIR)% : $(SRCS_DIR)%.c

我收到此错误

制作:***没有规则来制作目标......

这里是完整的文件

.SUFFIXES: .c
ROOT = $(addprefix $(PWD), /)
BUILDS_DIR = $(addprefix $(ROOT), builds/)
SRCS_DIR   = $(addprefix $(ROOT), src/)

SRCS = $(wildcard $(SRCS_DIR)*.c)

TARGETS = ${SRCS:$(SRCS_DIR)%.c=%}
EXES = ${addprefix $(BUILDS_DIR), $(TARGETS)}

CC      = gcc
CFLAGS  = -Wall -O3

RM = rm -f

.PHONY: all $(TARGETS) clean

all: $(TARGETS)

$(TARGETS): $(BUILDS_DIR)% : $(SRCS_DIR)%.c
    $(CC) $(CFLAGS) \
        $< \
        -o $@
    @echo -e "\n\n\t\t*** Compile successfully! ***\n" ;

clean:
    $(RM)   $(EXES) \
        $(SRCS_DIR)*~
    @echo -e "\n\n\t\t*** Cleanup complete! ***\n"

我哪里错了?我猜答案非常愚蠢,可能基于一个基本错误。

提前致谢

2 个答案:

答案 0 :(得分:0)

假设GNU Make(因为你使用它的语法)。

问题或者第一个问题是,您试图通过尝试将目标目录连接到模式而不是简单地使用目标&而错误地重写目标static pattern #39; s文件名。

你有:

$(TARGETS): $(BUILDS_DIR)% : $(SRCS_DIR)%.c
    $(CC) $(CFLAGS) $< -o $@

解决方案是使用命令行添加目录路径

$(TARGETS): % : $(SRCS_DIR)%.c
    $(CC) $(CFLAGS) $< -o $(BUILDS_DIR)$@

答案 1 :(得分:0)

让我们假设您的三个源文件是file1.cfile2.cfile3.c。我会创建makefile看起来像这样(假设GNU make)

CC = gcc
CFLAGS = -ansi -Wall -pedantic

RM = rm -f

OBJS = file1.o file2.o file3.o

PROG=my_program

$(PROG) : $(OBJS)
    $(CC) $(CFLAGS) $(OBJS) -o $(PROG)

all : clean $(PROG)

file1 : file1.c
    $(CC) $(CFLAGS) -c file1.c -o file1.o

file2 : file2.c
    $(CC) $(CFLAGS) -c file2.c -o file2.o

file3 : file3.c
    $(CC) $(CFLAGS) -c file3.c -o file3.o

clean :
    $(RM) *.o $(PROG) *.*~

使用此make文件的示例是(我使用-n来显示将运行的规则,但实际上并不运行它们,因为我的源文件是用于测试的空文件。)

    [******@broadsword junk]$ make -n
    gcc -ansi -Wall -pedantic   -c -o file1.o file1.c
    gcc -ansi -Wall -pedantic   -c -o file2.o file2.c
    gcc -ansi -Wall -pedantic   -c -o file3.o file3.c
    gcc -ansi -Wall -pedantic file1.o file2.o file3.o -o my_program
    [******@broadsword junk]$ make -n file1
    gcc -ansi -Wall -pedantic -c file1.c -o file1.o

我们可以使用外卡来缩短上面的make文件;

CC = gcc CFLAGS = -ansi -Wall -pedantic

RM = rm -f

OBJS = file1.o file2.o file3.o

PROG = MY-

$(PROG):$(OBJS)     $(CC)$(CFLAGS)$(OBJS)-o $(PROG)

all:clean $(PROG)

%:%。c     $(CC)$(CFLAGS)-c $&lt; -o $。。o

清洁:     $(RM)* .o $(PROG)

我们需要在输出文件名后附加一个'.o',以便我们以第一个构建规则的$(OBJ)变量定义的格式创建文件。这样做可以运行以下示例:

    [******@broadsword junk]$ make -n
    gcc -ansi -Wall -pedantic   -c -o file1.o file1.c
    gcc -ansi -Wall -pedantic   -c -o file2.o file2.c
    gcc -ansi -Wall -pedantic   -c -o file3.o file3.c
    gcc -ansi -Wall -pedantic file1.o file2.o file3.o -o my_program
    [******@broadsword junk]$ make -n file2
    gcc -ansi -Wall -pedantic -c file2.c -o file2.o
顺便说一句,我个人不介意输入额外的两个字符,我喜欢让我的目标匹配运行的规则集的输出,所以我会将规则写为

     file1.o : file1.c
         $(CC) $(CFLAGS) -c file1.c -o file1.o

     %.o :%.c
         $(CC) $(CFLAGS) -c $< -o $@

最后我强烈怀疑当我们执行makemake all时,我们没有在makefile的下半部分运行特定于文件的规则,而是运行所描述的内置规则在GNU手册中:“不使用$(CC) $(CPPFLAGS) $(CFLAGS) -c形式的配方从nc自动生成。”