代码之家  ›  专栏  ›  技术社区  ›  Trojax

编译多个。c和。h文件

  •  0
  • Trojax  · 技术社区  · 8 年前

    我的程序分为6个文件:

    1. 列表h(包含基本列表结构信息和函数原型)
    2. 列表c(包含上述实施)
    3. 搜索树。h(包含基本树结构信息和功能原型)
    4. 搜索树。c(包含上述实现,并包括列表h)
    5. 搜索h(同样,函数原型)
    6. 搜索c(aobve功能的实现)
    7. 主要的c(需要以上所有条件才能运行)

    我似乎不知道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 回复  |  直到 8 年前
        1
  •  1
  •   John Bode    8 年前

    您不需要为每个文件显式创建规则- make 有许多 implicit rules 这已经完成了你需要的90%。您的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 一种处理方法。

        2
  •  1
  •   Renaud Pacalet    8 年前

    类似于John的提议,但修复了一个小错误( $^ 自动变量代替 $? ),自动化程度更高( 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)