【问题标题】:How to use a makefile with Gtk [duplicate]如何在 Gtk 中使用 makefile [重复]
【发布时间】: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.cheader.h 输入编译器。标头本身不是编译单元。当您编译包含头文件的源文件时,它们会被隐式编译。不要将它们添加到编译器的命令行中。相反,您应该将标题添加到上面定义 .o 文件的依赖关系的行中。

标签: c gcc makefile gtk client-server


【解决方案1】:

你不需要把头文件放到你的编译行中,那么就这样做吧:

OBJS= client.o server.o

all: $(OBJS)
    $(LD) -o $(TARGET) $(OBJS) $(LDFLAGS)

client.o: client.c
    $(CC) -c $(CCFLAGS) client.c $(GTKLIB) -o client.o

server.o: server.c
    $(CC) -c $(CCFLAGS) server.c $(GTKLIB) -o server.o

clean:
    rm -f *.o $(TARGET)

如果您需要添加标题包含路径,则可以添加-I<path>

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多