簡體   English   中英

Makefile,鏈接庫

[英]Makefile, linking a library

我有4個源文件和5個頭文件,並且使用以下庫:

  • SDL
  • SDL_gfx
  • SDLmain
  • SDL_ttf

但是當我嘗試我的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

注意:在調用系統函數時,(幾乎)總是最好先定義一個宏,然后再調用該宏。 這樣可以提高靈活性,減少出錯的機會。 有關示例,請參見RMCC宏。

注意:最好不要定義將不使用的宏:例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM