【问题标题】:C: How to compile an header included in another header with makefile?C:如何使用makefile编译包含在另一个头文件中的头文件?
【发布时间】:2016-04-13 00:32:15
【问题描述】:

首先对不起我的英语不好......

这是我的问题: 我的应用程序由 main.c(主程序)、functions.c(代码)、functions.h(原型)和 headers.h(typedefs、定义等)组成。

在 main 的代码中(当然,在 functions.c 中)我包含了 functions.h,而在 functions.h 中我包含了 headers.h。

我应该如何在 makefile 中编译 headers.h?我没有 headers.c:我还需要创建 headers.o 吗?

这是我的 makefile 代码:

application: main.o functions.o
  gcc -o application main.o functions.o

main.o: main.c functions.o
  gcc -c -Wall -pedantic main.c

functions.o: functions.c functions.h
  gcc -c -Wall -pedantic functions.c

clean: 
  rm -f *.o

如果我手动编译 headers.h 一切正常

gcc -c -Wall -pedantic headers.h

编辑:这不再是真的。我不知道为什么它在 5 分钟前有效。

获取 .gch 文件。我应该在 makefile 的哪里写那行?

谢谢!

【问题讨论】:

  • 如果头文件发生更改,发布的 makefile 将无法重建目标文件。建议学习如何让makefile(在gcc的帮助下)创建依赖文件以及如何将所有这些合并到你的makefile中。此链接显示了一种方法:stackoverflow.com/questions/2394609/…>

标签: c makefile header-files


【解决方案1】:

您不编译标头。相反,您可以这样做:

main.o: main.c headers.h
  gcc -c -Wall -pedantic main.c

functions.o: functions.c functions.h headers.h
  gcc -c -Wall -pedantic functions.c

【讨论】:

  • main.o 没有理由依赖function.o。但是应该有一个规则program: main.o functions.o
  • 将CFLAGS += -Wall -pedantic 添加到顶部并从规则中删除主体(编译器调用);即,make 具有编译对象的隐式规则。
【解决方案2】:

只需在此处添加标题:

                                         v
functions.o: functions.c functions.h headers.h
  gcc -c -Wall -pedantic functions.c

并在 main.xml 中添加标题。您可以删除 functions.o,除非您希望 main.o 依赖于 functions.o:

main.o: main.c functions.h headers.h
  gcc -c -Wall -pedantic main.c

你不需要创建 headers.o,你不应该编译 headers。

【讨论】:

    【解决方案3】:

    您不必编译标头。你可以这样做:

    SRCS =  ./main.c \
            ./function.c \
    
    OBJS = $(SRCS:.c=.o)
    
    all: application
    
    application:    $(OBJS)
                    gcc -Wall -pedantic $(OBJS) -I./ -o output_name
    
    clean:
                    rm -f $(OBJS)
    

    然后:make all

    【讨论】:

      【解决方案4】:

      除了其他答案....

      [我]得到一个 .gch 文件。我应该在 makefile 的哪里写那行?

      .gch 扩展用于 GCC 预编译的头文件。这对新手来说不是一个功能,对于小型(少于一百万行源代码)软件项目也不是一个有用的功能。有关您可能不需要的预编译标头的更多信息,请参阅this answer。

      因此,在修复您的 Makefile 并将源代码提交到您的版本控制系统之后(如果您不使用,请现在在做任何其他事情之前使用 git!),您可以rm -vif *.gch

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        相关资源
        最近更新 更多