这是我在这个论坛上的第一篇文章。很抱歉打扰,但我一直在寻找类似的东西,奇怪的是我无法找到它。这就是问题所在。 我有三个(主要)文件,没有标题,我想立即编译它们(如果我只是键入" 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"
我哪里错了?我猜答案非常愚蠢,可能基于一个基本错误。
提前致谢
答案 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.c
,file2.c
和file3.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 $@
最后我强烈怀疑当我们执行make
或make all
时,我们没有在makefile的下半部分运行特定于文件的规则,而是运行所描述的内置规则在GNU手册中:“不使用$(CC) $(CPPFLAGS) $(CFLAGS) -c
形式的配方从nc自动生成。”