需要帮助为SDL C++教程设置Makefile - 无法链接目标文件

我正在尝试为我正在执行的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生成目标文件,但是我需要在生成文件中修改哪些内容才能生成可运行程序?

回答:

这里有一个略微更“规范”的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.%

回答:

如果你希望你的可执行文件被称为“富”,添加此规则,以你的makefile(并使其成为第一条规则,如果你希望它是默认值):

foo: $(OBJS) 

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

(另请注意,在$(OBJ_DIR)/%.o规则,你有-c标志的两倍,而什么都不做的链接标志。你可能需要更新您的clean规则删除可执行文件。)

以上是 需要帮助为SDL C++教程设置Makefile - 无法链接目标文件 的全部内容, 来源链接: utcz.com/qa/257618.html

回到顶部