Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要为SDL C+;设置生成文件的帮助吗+;教程-链接对象文件时遇到问题 我试图为我正在做的SDL C++教程获得一个基本的MaFIX文件。到目前为止,我已经做了一些搜索,我已经找到了一个Makefile,它将为我的Main和Graphics类生成对象文件,并将我的Graphics头链接到一个单独的目录中。然而,当我试图链接我的目标文件以生成我可以运行的程序时,我遇到了一些问题。 我的目录设置如下: source |__headers | |__graphics.h | |__object | |__src | |__main.cpp | |__graphics.cpp | |__Makefile_Makefile - Fatal编程技术网

需要为SDL C+;设置生成文件的帮助吗+;教程-链接对象文件时遇到问题 我试图为我正在做的SDL C++教程获得一个基本的MaFIX文件。到目前为止,我已经做了一些搜索,我已经找到了一个Makefile,它将为我的Main和Graphics类生成对象文件,并将我的Graphics头链接到一个单独的目录中。然而,当我试图链接我的目标文件以生成我可以运行的程序时,我遇到了一些问题。 我的目录设置如下: source |__headers | |__graphics.h | |__object | |__src | |__main.cpp | |__graphics.cpp | |__Makefile

需要为SDL C+;设置生成文件的帮助吗+;教程-链接对象文件时遇到问题 我试图为我正在做的SDL C++教程获得一个基本的MaFIX文件。到目前为止,我已经做了一些搜索,我已经找到了一个Makefile,它将为我的Main和Graphics类生成对象文件,并将我的Graphics头链接到一个单独的目录中。然而,当我试图链接我的目标文件以生成我可以运行的程序时,我遇到了一些问题。 我的目录设置如下: source |__headers | |__graphics.h | |__object | |__src | |__main.cpp | |__graphics.cpp | |__Makefile,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)/graphic

生成文件:

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
CC=g++
INC_DIR=标题
SRC_DIR=SRC
OBJ_DIR=对象
编译器\u标志=-c-Wall-I$(INC\u DIR)
链接器_标志=-lSDL2
SRCS=$(SRC\u DIR)/main.cpp$(SRC\u DIR)/graphics.cpp
OBJS=$(OBJ_DIR)/main.o$(OBJ_DIR)/graphics.o
DEPS=$(INC_DIR)/graphics.h
全部:$(OBJS)
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp
$(CC)$(编译器标志)$(链接器标志)-c$<-o$@
$(预算署署长)/%。编制:$(部门)
清洁:
rm-rf$(OBJS)全部
rm-rf SDLC
my main.cpp和graphics.cpp都有以下功能:

#include <SDL2/SDL.h>
#include "graphics.h"
#包括
#包括“graphics.h”

我可以在我的objects目录下为main.cpp和graphics.cpp生成对象文件,但是我需要在makefile中修改什么才能生成可运行的程序?

如果您希望您的可执行文件被称为“foo”,请将此规则添加到您的makefile中(如果您希望它成为默认规则,则将其作为第一个规则):

(还要注意,在您的
$(OBJ_DIR)/%.o
规则中,您有两个
-c
标志,以及一个不执行任何操作的链接器标志。您可能需要更新
清除
规则以删除可执行文件。)

这里有一个稍微“规范化”的GNU Makefile来执行此任务,要点是:

  • Make有许多内置变量和配方(
    CPPFLAGS
    等),在指定自己的变量和配方时,您不必模仿Make的用法,但它可能会帮助其他必须维护Make文件的人

  • 简单地扩展变量(
    :=
    )可以帮助避免更深层次的问题,假设您不需要递归扩展(这里不需要)

  • GCC和Clang都可以通过编译过程中的
    -M
    预处理器标志自动生成依赖项

  • 不是实际文件的目标应该是
    .PHONY

  • 由于您为编译提供了自己的配方和依赖项,因此使用静态模式(
    blah:%.o:%.cpp
    )将确保忽略其他隐式规则,这会增加加速编译的副作用。这在这里不会有什么不同,它可能并不总是你所需要的,但它是需要记住的

  • include$(DEPS)
    之后的最后一部分去掉了一些内置的东西,比如重新生成生成文件以加快速度,同样,它可能并不总是您所需要的,在这样一个小项目中也不会有什么不同,但很高兴知道这一点

INC\u DIR:=标题
SRC_DIR:=SRC
对象目录:=对象
CC:=g++
CPPFLAGS:=-I$(INC\u DIR)-MMD-MP
CXXFLAGS:=-Wall
LDLIBS:=-lSDL2
来源:=$(通配符$(SRC_DIR)/*.cpp)
对象:=$(源:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)
DEPS:=$(通配符$(对象目录)/*.d)
.假冒:干净
main:$(对象)
$(CC)$(LDFLAGS)$^$(LDLIBS)-o$@
$(对象):$(对象目录)/%.o:$(SRC目录)/%.cpp
$(CXX)$(CXXFLAGS)$(CPPFLAGS)-c$(输出_选项)$<
清洁:$(RM)$(DEPS)$(对象)
包括美元(DEPS)
$(生成文件列表):;
%:%,v
%::RCS/%,v
%::RCS/%
%::s.%
%::SCCS/s.%
foo: $(OBJS)
    $(CC) $(LINKER_FLAGS) $^ -o $@