2015-10-06 32 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规则删除可执行文件。)