编译多个.c和.h文件

编译多个.c和.h文件,c,struct,makefile,compilation,include,C,Struct,Makefile,Compilation,Include,我的程序分为6个文件: h(包含基本列表结构信息和函数原型) 清单c(包含上述内容的实施) search_tree.h(包含基本树结构信息和函数原型) search_tree.c(包含上述的实现,包括list.h) search.h(同样是函数的原型) search.c(aobve功能的实现) main.c(需要以上所有功能才能运行) 我似乎无法弄清楚makefile应该是什么,我尝试了下面的一个,但它不起作用,并且我得到了未实现的结构和函数的错误 myprog: list.o search_t

我的程序分为6个文件:

  • h(包含基本列表结构信息和函数原型)
  • 清单c(包含上述内容的实施)
  • search_tree.h(包含基本树结构信息和函数原型)
  • search_tree.c(包含上述的实现,包括list.h)
  • search.h(同样是函数的原型)
  • search.c(aobve功能的实现)
  • main.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
    

    您不需要为每个文件显式地创建规则-
    make
    有许多规则已经完成了您所需的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 
    
    已经有一个隐式规则从
    .c
    文件生成
    .o
    文件,因此您不需要创建自己的文件,除非您希望覆盖默认值,即

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

    您确实需要显式的
    myprog
    规则将对象文件链接到可执行文件中,因为可执行文件名与任何源文件名或对象文件名都不匹配
    $@
    扩展到目标名称,
    myprog
    $?
    扩展到目标的先决条件列表(即对象文件)
    $您不需要为每个文件显式创建规则-
    make
    有许多规则已经完成了您所需的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 
    
    已经有一个隐式规则从
    .c
    文件生成
    .o
    文件,因此您不需要创建自己的文件,除非您希望覆盖默认值,即

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

    您确实需要显式的
    myprog
    规则将对象文件链接到可执行文件中,因为可执行文件名与任何源文件名或对象文件名都不匹配
    $@
    扩展到目标名称,
    myprog
    $?
    扩展到目标的先决条件列表(即对象文件)<代码>$类似于John的建议,修复了一个小错误(
    $^
    自动变量而不是
    $?
    ),自动化程度更高(
    通配符
    用于搜索C源文件),并为头文件添加了依赖项(
    $(OBJS):%.o:%.h
    静态模式规则):


    类似于John的建议,修复了一个小错误(
    $^
    自动变量而不是
    $?
    ),自动化程度更高(
    通配符
    ,用于搜索C源文件),并且添加了头文件的依赖项(
    $(OBJS):%.o:%.h
    静态模式规则):


    .h
    文件未编译。“不起作用”不是有效的问题描述。您有两个搜索规则。o其中一个应该是搜索树。o如果所有文件都在同一个目录中,您可以键入:
    gcc-o myprog*.c
    dir@odin是的,我在复制代码时很糟糕,我现在正在编辑它。你怎么确定这是一个生成文件问题?你试过全部手工编译吗?如果它抱怨找不到结构,我觉得你好像忘记了
    #include
    某处
    .h
    文件没有编译。“不起作用”不是有效的问题描述。您有两个搜索规则。o其中一个应该是搜索树。o如果所有文件都在同一个目录中,您可以键入:
    gcc-o myprog*.c
    dir@odin是的,我在复制代码时很糟糕,我现在正在编辑它。你怎么确定这是一个生成文件问题?你试过全部手工编译吗?如果它抱怨找不到结构,我觉得你好像忘记了一个
    #include
    somewhere很好的答案,很多帮助。谢谢!回答得很好,有很多帮助。谢谢!