2015-10-06 62 views
1

我正在嘗試爲我正在執行的SDL C++教程獲取基本的makefile。到目前爲止,我已經做了一些搜索,並且我已經提出了一個Makefile,它將爲我的Main和我的Graphics類生成目標文件,並鏈接位於單獨目錄中的Graphics頭。當我嘗試鏈接我的對象文件以生成可以運行的程序時,我遇到了問題。 我的目錄設置像這樣:需要幫助爲SDL C++教程設置Makefile - 無法鏈接目標文件

source 
|__headers 
| |__graphics.h 
| 
|__object 
| 
|__src 
| |__main.cpp 
| |__graphics.cpp 
| 
|__Makefile 

的Makefile:

CC = g++ 
INC_DIR = headers 
SRC_DIR = src 
OBJ_DIR = object 
COMPILER_FLAGS = -c -Wall -I$(INC_DIR) 
LINKER_FLAGS = -lSDL2 

SRCS = $(SRC_DIR)/main.cpp $(SRC_DIR)/graphics.cpp 
OBJS = $(OBJ_DIR)/main.o $(OBJ_DIR)/graphics.o 

DEPS = $(INC_DIR)/graphics.h 

all : $(OBJS) 

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
    $(CC) $(COMPILER_FLAGS) $(LINKER_FLAGS) -c $< -o [email protected] 

$(OBJ_DIR)/%.o: $(DEPS) 

clean: 
    rm -rf $(OBJS) all 
    rm -rf SDLCS 

無論我的main.cpp和graphics.cpp有這些包括:

#include <SDL2/SDL.h> 
#include "graphics.h" 

我能爲我的對象目錄下的main.cpp和graphics.cpp生成目標文件,但是我需要在生成文件中修改哪些內容才能生成可運行程序?

回答

3

這裏有一個略微更「規範」的GNU的Makefile,做的工作,要點是:

  • Make有許多內置變量和配方(CPPFLAGS等),您不必在指定自己的變量和配方時模擬make自己的用法,但它可能有助於其他必須維護Makefile的人員。

  • 只要擴展變量(:=)可以幫助您避免鏈下的問題,假設您不需要遞歸擴展(您不在這裏)。

  • 作爲編譯過程的一部分,GCC和Clang可以使用-M預處理器標誌自動生成依賴關係。

  • 不是實際文件的目標應該是.PHONY

  • 由於您提供了自己的配方和編譯依賴關係,因此使用靜態模式(blah: %.o: %.cpp)將確保忽略其他隱式規則,這會加快make的進度。它在這裏沒有什麼不同,它可能並不總是你需要的,但需要牢記。

  • include $(DEPS)後的最後部分被去掉一些內置的東西一樣重塑的makefile加快速度,它再次可能並不總是你需要什麼,它不會讓這樣的小項目的差異,但它很高興知道。

INC_DIR := headers 
SRC_DIR := src 
OBJ_DIR := object 

CC  := g++ 
CPPFLAGS := -I$(INC_DIR) -MMD -MP 
CXXFLAGS := -Wall 
LDLIBS := -lSDL2 

SOURCES := $(wildcard $(SRC_DIR)/*.cpp) 
OBJECTS := $(SOURCES:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o) 
DEPS := $(wildcard $(OBJ_DIR)/*.d) 

.PHONY: clean 

main: $(OBJECTS) 
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o [email protected] 

$(OBJECTS): $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(OUTPUT_OPTION) $< 

clean: ; $(RM) $(DEPS) $(OBJECTS) 

include $(DEPS) 

$(MAKEFILE_LIST): ; 
%:: %,v 
%:: RCS/%,v 
%:: RCS/% 
%:: s.% 
%:: SCCS/s.% 
+0

真棒,我在這裏學到了很多東西。感謝您的幫助! – Victor

0

如果你希望你的可執行文件被稱爲「富」,添加此規則,以你的makefile(並使其成爲第一條規則,如果你希望它是默認值):

foo: $(OBJS) 
    $(CC) $(LINKER_FLAGS) $^ -o [email protected] 

(另請注意,在$(OBJ_DIR)/%.o規則,你有-c標誌的兩倍,而什麼都不做的鏈接標誌。你可能需要更新您的clean規則刪除可執行文件。)