我有一个关于在 Makefile 中编译和链接的问题(也许一般来说)。
我有一个 server.c 文件,它由具有功能的主程序组成main()
。server.c
包括 rio.c。我有一个名为的模块rio
,它由rio.c
和组成rio.h
。它没有任何main()
功能。
我有两个问题,如何实际编写 Makefile,以及这样做的最佳实践。
Q1:如何编写 Makefile
我有以下 Makefile:
CC = gcc
CFLAGS = -Wall -Werror -Wmissing-prototypes
OBJS = server.o rio.o
all: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o sysstatd
server.o: server.c
$(CC) $(CFLAGS) -c server.c
rio.o: rio.c rio.h
$(CC) $(CFLAGS) -c rio.c
clean:
rm -f *~ *.o sysstatd
我有与此相关的问题。它说我对 C 中使用的所有函数都有多个定义。我不确定这是怎么可能的,因为 server.c 是用-c
标志编译的,所以实际上没有任何链接。它应该知道一些函数存在但实际上并没有链接它们,直到all
规则将两个目标文件编译在一起并生成一个包含所有链接的目标文件。
这里有什么问题?
Q2:最佳实践
由于我有一个模块,然后是另一个包含主程序的文件,我应该将主程序编译server.c
为一个单独的模块,然后将两者一起all
编译,还是编译 server.c 并添加 rio。 o 模块在那里?请注意,这仍然会产生与我上面相同的链接问题,所以我很确定我的问题出在其他地方。