gpt4 book ai didi

c++ - Makefile:动态源文件名和对象目录

转载 作者:行者123 更新时间:2023-11-28 04:31:39 25 4
gpt4 key购买 nike

我目前正在尝试改进我用来使用 sfml 框架构建我的 c++ 项目的 makefile。我项目的文件夹结构目前如下所示:

  • 头文件的 Src/Header
  • .cpp 文件的 Src/Source
  • Bin/为 .exe
  • lib/用于 sfml 库

我当前的生成文件:

CC  = g++ -g    

SRC = Src/Source/

BIN = Bin/

INC = -I Lib/SFML/include/ -I Src/Header/

LIB = -L Lib/SFML/lib/ -lsfml-graphics-d -lsfml-window-d -lsfml-system-d

EXE = Test

SOURCEFILES = $(SRC)Main.cpp $(SRC)Menu.cpp $(SRC)Button.cpp

OBJ = $(SOURCEFILES:.cpp=.o)

all: $(SOURCEFILES) $(EXE)

$(EXE) : $(OBJ)
$(CC) -o $(BIN)$(EXE).exe $(OBJ) $(LIB)

.cpp.o:
$(CC) -c $< $(INC) -o $@

这个 makefile 工作正常,但是有一些我想改进但无法开始工作的地方。

  1. 目前需要手动将所有 cpp 文件添加到源文件列表中。由于该项目在文件数量方面很可能会快速增长,而且我有点想将源文件拆分到不同的子目录中,这很快就会变得一团糟。我试图用 $(wildcard Src/Source/*.cpp) 获取目录中的所有 cpp 文件,而不是单独列出它们,但它甚至无法执行 makefile。我在那里缺少什么?

  2. 在我当前的 makefile 中,所有 .o 文件都放置在与 .cpp 文件相同的位置,这也是我真正不想要的。有没有一种方法可以将所有 .o 文件输出到一个额外的\obj\目录中,并从那里将其链接到 .exe 中?

此外,由于这是我第一次编写 makefile,如果我的方法有一些一般性的改进,也欢迎任何建议。

最佳答案

  1. 通配符 应该有效:

    SOURCEFILES = $(wildcard $(SRC)/*.cpp)
  2. 但是如果您计划将源文件放在 Src/Source/ 的各个子目录中,那么它就不会很好地工作。多亏了 shell make 函数,请改用 find 实用程序。是的,您可以将所有目标文件存储在一个单独的目录中:

    CC  = g++ -g
    SRC = Src/Source/
    OBJ = Obj/
    BIN = Bin/
    INC = -I Lib/SFML/include/ -I Src/Header/
    LIB = -L Lib/SFML/lib/ -lsfml-graphics-d -lsfml-window-d -lsfml-system-d
    EXE = $(BIN)Test.exe

    SOURCEFILES = $(shell find $(SRC) -type f -name *.cpp)
    OBJECTFILES = $(patsubst $(SRC)%.cpp,$(OBJ)%.o,$(SOURCEFILES))

    all: $(SOURCEFILES) $(EXE)

    $(EXE): $(OBJECTFILE)
    $(CC) -o $@ $^ $(LIB)

    $(OBJ)%.o: $(SRC)%.cpp
    mkdir -p $(dir $@)
    $(CC) -c $< $(INC) -o $@

请注意,我还修改了您的 EXE 定义,以便相应的规则是一个真正的文件到文件生成规则并使用 $@$ ^ 自动变量。

关于c++ - Makefile:动态源文件名和对象目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52743021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com