C - 使用 gnu 的 Makefile,包含 2 个 .c 文件和 1 个 .h 文件

标签 c makefile gnu

我有两个 .c 文件 - sort.c 和 fileio.c - 主要功能在 sort.c 中。然后我有一个 .h 文件 - fileio.h。当我手动编译所有这些文件时,一切正常。但我的 Makefile 遇到了问题。

我已经为 Makefile 指令行正确设置了选项卡 - 不确定您是否能够通过在此处查看它来判断。这是我到目前为止所拥有的:

CC = gcc
sort : sort.o fileio.o
        gcc sort.o fileio.o -o sort
sort.o : sort.c fileio.c
        gcc -g sort.c fileio.c -o sort.o
fileio.o : fileio.c fileio.h
        gcc -g fileio.c -o fileio.o

但是当我运行这个时,我得到了 Undefined Reference to 'main' 错误...我对此非常困惑,因为事实上,sort.c 中有一个 main() 函数。

谁能告诉我哪里出错了?我花了很长时间阅读教程,它们都比我需要的更复杂,并且没有解决这个错误。

最佳答案

您需要使用 -c 标志构建 .o 对象。否则它们将被编译为可执行文件,这需要入口点 main() 函数。您还应该从 sort.o 目标的编译规则中删除 fileio.c。并且依赖项可能是 sort.h 和/或 fileio.h,但不是 fileio.c。您还可以使用 $@(目标名称),而不是将其显式键入规则中。

CC = gcc

sort : sort.o fileio.o
        $(CC) sort.o fileio.o -o $@
sort.o : sort.c fileio.h
        $(CC) -g  sort.c -c -o $@
fileio.o : fileio.c fileio.h
        $(CC) -g fileio.c -c -o $@

请注意,例如,通常使用利用标准变量的规则是有意义的

$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@

并分别使用 CPPFLAGSCFLAGS 作为预处理器和编译器标志。

关于C - 使用 gnu 的 Makefile,包含 2 个 .c 文件和 1 个 .h 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26519351/

相关文章:

c++ - 如何让 gcc 打印所有链接的库?

c - 交换链表中的相邻元素

c - 在 C 中读取文件和字符串数组

c - 分析这个算法(big-o)

c++ - 在 RHEL 7 上编译 mysqlclient 并在 RHEL 6 上运行(Linux 上为 g++)

c++ - gcc 或 makefile 是否有一种机制可以描述源文件的包含文件以替换 #include "xxxx.h"?

linux - 将 Visual Studio makefile 转换为 Linux makefile

c - 使用 GNU Scientific C 的多项式拟合

c++ - 更改 GNU 编译器中的 -g 标志使 c++ 可执行

linux - gnu 联机帮助页,关于 "env"命令的两个版本的文档