编译多个.c和.h文件

时间:2017-10-25 18:52:19

标签: c struct makefile compilation include

我的程序分为6个文件:

  1. list.h(包含基本列表结构信息和函数原型)
  2. list.c(包含上述实现)
  3. search_tree.h(包含基本树结构信息和函数原型)
  4. search_tree.c(包含上述实现,包括list.h)
  5. search.h(再次,函数原型)
  6. search.c(aobve函数的实现)
  7. main.c(需要以上所有才能运行)
  8. 我似乎无法弄清楚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
    

2 个答案:

答案 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)