[英]Makefile, linking a library
我有4个源文件和5个头文件,并且使用以下库:
但是当我尝试我的makefile文件时,出现以下错误:
/usr/bin/ld: cannot find -lSDL_gfx.
这是我到目前为止拥有的make文件:
第一条规则将所有目标文件链接在一起,其他规则负责创建目标文件
CC=gcc
CFLAGS=-I -c -fmessage-length=0 -D_SDL_main_h -lSDL -lSDL_ttf -lSDL_gfx.
DEPS = game.h field.h cell.h allocate_field.h GUI.h
OBJ = game.o field.o allocate_field.o GUI.o
OUTPUT = game
all: $(OBJ)
@echo Programma aanmaken
gcc -o $@ $^ $(CFLAGS)
game.o : game.c field.h GUI.h
@echo Bezig met game.o te compileren
$(CC) -c -o game.o game.c
field.o : field.c allocate_field.h cell.h
@echo Bezig met field.o te compileren
$(CC) -c -o field.o field.c
allocate_field.o : cell.h
@echo Bezig met allocate_field.o te compileren
$(CC) -c -o allocate_field.o allocate_field.c
GUI.o : field.h cell.h
@echo Bezig met GUI.o te compileren
$(CC) -L/home/usr/lib/x86_64-linux-gnu -lSDL -lSDL_ttf -lSDL_gfx -c -o GUI.o GUI.c
.PHONY : clean
clean:
@echo Cleaning... Object files verwijderen
rm -f *.o
rm -f $(OUTPUT)
编辑
我的库所在的目录是/ usr / lib / x86_64-linux-gnu。
我在上面提到的目录中尝试了echo命令,但无法正常工作
编辑编辑
我认为您的意思是CFLAGS行中的点。 我将其删除,然后出现此错误:
undefined reference to `IMG_Load' which is one the functions of the SDL_image library
然后,我还添加了-lSDL_image,现在它可以工作了。
你有一个额外的点。 去掉它。
在发布的makefile中有几个“ oops”。
注意:: :=
用于宏定义,因此它们仅被评估一次。
注意:可以使用: SRC := $(wildcard *.c)
然后OBJ := $(SRC:.c=.o)
获取目标文件列表。 但是,当前目录中不得有任何杂散* .c文件
注意:仅在链接时需要库文件。
注意:编译时应始终启用所有警告,然后修复这些警告。
注意:链接时,命令行上项目的顺序很重要。 始终放置库路径,后跟“短”库名称
注意:如果“目标”规则实际上未创建具有相同名称的文件,请始终使用以下规则进行处理: .PHONY : target
注意:在调用系统函数时,(几乎)总是最好先定义一个宏,然后再调用该宏。 这样可以提高灵活性,减少出错的机会。 有关示例,请参见RM
和CC
宏。
注意:最好不要定义将不使用的宏:例如DEP
宏
您可能需要使用与此类似的内容进行编译和链接,因为它不会调用Shell功能echo
并且会产生更好的输出
game.o : game.c field.h GUI.h
#
# ========= START $< TO $@ =========
$(CC) $(CFLAGS) -c $< -o $@ -I.
# ========= END $< TO $@ =========
#
通过使用以下命令:(注意: gcc
具有可以执行此操作的参数)
%.d: %.c
#
# ========= START $< TO $@ =========
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
# ========= END $< TO $@ =========
加上这个:
%.o: %.c %.d
#
# ========= START $< TO $@ =========
$(CC) $(CCFLAGS) -c $< -o $@ -I.
# ========= END $< TO $@ =========
#
这:(带有DEP
宏)
ifneq "$(MAKECMDGOALS)" "clean"
-include $(DEP)
endif
然后make
将生成所有依赖项信息,因此不必将其硬编码到makefile中,并且所有compile语句都将折叠为一个:
%.o: %.c %.d
#
# ========= START $< TO $@ =========
$(CC) $(CCFLAGS) -c $< -o $@ -I.
# ========= END $< TO $@ =========
#
上面的内容对这个项目不会有太大的影响,但是当项目包含数百个文件时,可以节省大量时间和调试精力
建议的makefile纠正了所有明显的问题,并允许通过以下方式运行:
make
or
make game
or
make all
or for individual file compilation
make <objectFileName>
这是建议的makefile
RM := /usr/bin/rm
CC := /usr/bin/gcc
CFLAGS := -c -fmessage-length=0 -D_SDL_main_h
#a better CFLAGS would be:
#CFLAGS := -fmessage-length=0 -D_SDL_main_h -std=c99 -Wall -Wextra -pedantic -Wconversion -c
LFLAGS :=
LIBS := -L/usr/lib/x86_64-linux-gnu -lSDL -lSDL_ttf -lSDL_gfx
# DEPS := game.h field.h cell.h allocate_field.h GUI.h
OBJ := game.o field.o allocate_field.o GUI.o
OUTPUT := game
.PHONY : all
all: $(OUTPUT)
$(OUTPUT): $(OBJ)
@echo Programma aanmaken
$(CC) $(LFLAGS) -o $@ $(OBJ) $(LIBS)
game.o : game.c field.h GUI.h
@echo Bezig met game.o te compileren
$(CC) $(CFLAGS) -c $< -o $@ -I.
field.o : field.c allocate_field.h cell.h
@echo Bezig met field.o te compileren
$(CC) $(CFLAGS) -c $< -o $@ -I.
allocate_field.o : allocate_field.c cell.h
@echo Bezig met allocate_field.o te compileren
$(CC) $(CFLAGS) -c $< -o $@ -I.
GUI.o : GUI.c field.h cell.h
@echo Bezig met GUI.o te compileren
$(CC) $(CFLAGS) -c $< -o $@ -I.
.PHONY : clean
clean:
@echo Cleaning... Object files verwijderen
$(RM) -f *.o
$(RM) -f $(OUTPUT)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.