我正在尝试为我正在做的SDL C ++教程运行一个基本的makefile。到目前为止,我已经做了一些搜索,并且我想出了一个Makefile,它将为我的Main和我的Graphics类生成目标文件,以及链接我在单独目录中的Graphics头。我遇到问题但是在尝试链接我的目标文件以生成我可以运行的程序时。 我的目录设置如下:
source
|__headers
| |__graphics.h
|
|__object
|
|__src
| |__main.cpp
| |__graphics.cpp
|
|__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 $@
$(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生成目标文件,但是我需要在makefile中修改什么才能生成可运行的程序?
答案 0 :(得分: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 $@
$(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.%
答案 1 :(得分:0)
如果您希望调用可执行文件&#34; foo&#34;,请将此规则添加到您的makefile中(如果您希望它是默认设置,则将其作为第一个规则):
foo: $(OBJS)
$(CC) $(LINKER_FLAGS) $^ -o $@
(另请注意,在$(OBJ_DIR)/%.o
规则中,您有-c
标志两次,并且链接器标记不执行任何操作。您可能希望更新clean
规则以删除可执行文件。)