【发布时间】:2020-05-29 09:08:14
【问题描述】:
我的代码应该分为客户端、服务器和头文件。这是全部在一个文件中的makefile -
# change application name here (executable output name)
TARGET=BugTrack
# compiler
CC=gcc
# debug
DEBUG=-g
# optimisation
OPT=-O0
# warnings
WARN=-Wall
PTHREAD=-pthread
CCFLAGS=$(DEBUG) $(OPT) $(WARN) $(PTHREAD) -pipe
GTKLIB=`pkg-config --cflags --libs gtk+-3.0`
# linker
LD=gcc
LDFLAGS=$(PTHREAD) $(GTKLIB) -export-dynamic
OBJS= client.o
all: $(OBJS)
$(LD) -o $(TARGET) $(OBJS) $(LDFLAGS)
client.o: client.c
$(CC) -c $(CCFLAGS) client.c $(GTKLIB) -o client.o
clean:
rm -f *.o $(TARGET)
这很有效。但是把最后一部分改成这个-
OBJS= client.o server.o
all: $(OBJS)
$(LD) -o $(TARGET) $(OBJS) $(LDFLAGS)
client.o: client.c
$(CC) -c $(CCFLAGS) client.c header.h $(GTKLIB) -o client.o
server.o: server.c
$(CC) -c $(CCFLAGS) server.c header.h $(GTKLIB) -o server.o
clean:
rm -f *.o $(TARGET)
给我一个错误,上面写着fatal error: cannot specify -o with -c, -S or -E with multiple files。
我该如何解决?
【问题讨论】:
-
您只想为每个规则编译 1 个源文件,但您指定了多个文件。您正在将
server.c和header.h输入编译器。标头本身不是编译单元。当您编译包含头文件的源文件时,它们会被隐式编译。不要将它们添加到编译器的命令行中。相反,您应该将标题添加到上面定义 .o 文件的依赖关系的行中。
标签: c gcc makefile gtk client-server