我的程序分为6个文件:
我似乎无法弄清楚makefile应该是什么,我已经尝试了下面的那个,但它不起作用,我得到结构和函数没有实现的错误。
myprog: list.o search_tree.o search.o main.o
gcc -o myprog list.o search_tree.o search.o main.o
list.o: list.c list.h
gcc -c list.c
search_tree.o: search_tree.c search_tree.h
gcc -c search_tree.c
search.o: search.c search.h
gcc -c search.c
main.o: search.h search_tree.h list.h hash_table.h
gcc -c main.c
答案 0 :(得分:1)
您无需为每个文件明确创建规则 - make
的{{3}}数量已达到所需数量的90%implicit rules。您的makefile可以像
CC=gcc
CFLAGS=-std=c11 -pedantic -Wall -Werror # my usual compiler flags
LDFLAGS= # specify additional libraries and library search paths here
myprog: main.o search.o search_table.o list.o
$(CC) -o $@ $(LDFLAGS) $?
clean:
rm -rf myprog *.o
从.o
文件构建.c
文件已经存在隐式规则,因此您不需要创建自己的文件,除非您要覆盖默认值,即
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
您确实需要显式myprog
规则将目标文件链接到可执行文件,因为可执行文件名与任何源文件名或目标文件名都不匹配。 $@
扩展为目标名称myprog
,$?
扩展为目标的先决条件列表(即目标文件)。 $<
扩展为先决条件列表中的第一个名称。
这不包括头文件依赖项,但是您的项目足够小,不会出现太多问题。但是,给this article一个读取方法来处理它。
答案 1 :(得分:1)
类似于约翰提出的修复小错误($^
自动变量而不是$?
)的提案,更多的自动化(wildcard
来搜索C源文件)和依赖关系添加了头文件($(OBJS): %.o: %.h
静态模式规则):
EXEC := myprog
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
$(EXEC): $(OBJS)
$(CC) -o $@ $(LDFLAGS) $^
$(OBJS): %.o: %.h
clean:
rm -f $(EXEC) $(OBJS)