【发布时间】:2016-03-29 08:07:34
【问题描述】:
我创建了一个 makefile 来编译和链接我的程序,但是,我不知道为什么会出现这个错误。和 SDL 有关系吗?
GCC = gcc
CFLAGS = -c -std=c99 -lm -Wall -Wextra -pedantic -O3 -Wfloat-equal -g
SDL = -lSDL2 -lSDL2_ttf -lSDL2_image -lSDL2_mixer
all: ./game
game: global.o display.o player.o entities.o controls.o sound.o menu.o
$(GCC) $(CFLAGS) global.o display.o player.o entities.o controls.o sound.o menu.o -o game
global.o: global.c
$(GCC) $(CFLAGS) $(SDL) global.c
display.o: display.c
$(GCC) $(CFLAGS) $(SDL) display.c
player.o: player.c
$(GCC) $(CFLAGS) $(SDL) player.c
entities.o: entities.c
$(GCC) $(CFLAGS) $(SDL) entities.c
controls.o: controls.c
$(GCC) $(CFLAGS) $(SDL) controls.c
sound.o: sound.c
$(GCC) $(CFLAGS) $(SDL) sound.c
menu.o: menu.c
$(GCC) $(CFLAGS) $(SDL) menu.c
clean:
rm *o game
【问题讨论】:
-
您的
CFLAGS中有-c。这意味着编译但不链接。而且您在应该链接的game目标的规则中使用这些标志。 -
编译目标文件时不需要
$(SDL)宏;它只指定库。您确实需要链接命令的命令行中的$(SDL)宏。您需要一个宏,例如OBJECTS = global.o display.o player.o entities.o controls.o sound.o menu.o,然后您可以在链接依赖项和链接命令中使用它,这可能应该是$(CC) -o $@ $(CFLAGS) $(OBJECTS) $(LDFLAGS) $(LDLIBS),其中LDFLAGS可能指定-L/usr/local/sdl/lib和LDLIBS将包括$(SDL)还有-lm选项。 CFLAGS 宏不应包含-c。
标签: c compilation makefile linker