gpt4 book ai didi

c++ - 在应用程序中使用不同的文件夹构建 makefile

转载 作者:行者123 更新时间:2023-11-28 07:05:26 27 4
gpt4 key购买 nike

我正在尝试为我的项目创建一个 makefile,但我真的不明白这个鬼东西。

当我在 Java 中使用 ant 时,它要简单得多。

我的程序结构是:http://imageshack.com/a/img39/6592/jsxa.png

我读过有关创建 makefile 的内容,但是当他们回答类似的问题时,他们只是将完成的 makefile 放在一起,并没有过多解释他们在做什么。

因此,我需要做的是创建一个 makefile,它与 src 文件夹 (foo/src/) 一起位于名为 foo (foo/makefile) 的文件夹中。makefile 需要创建一个名为 bin (foo/bin/) 的文件夹并将 *.o 文件放在那里。然后构建程序(DisqueRango.cpp 包含主要功能)并使用 4 个参数运行它:“-e couriers.csv -c menu.csv”。

我不是要完成的 makefile。我需要的是关于我需要自己做的事情的解释。

真的谢谢你。

src/clients/的makefile

CC := g++

OBJ = *.cpp

all: prog

prog:
$(CC) -c $(OBJ)

src/disquerango/的makefile(包含主要功能)

CC := g++

BASEDIR := ..
MODULES := clients couriers products read requests
OBJS := $(addsuffix /*.o, $(addprefix $(BASEDIR)/,$(MODULES)))

.PHONY: clean

all:
$(CC) -o disquer DisqueRango.cpp $(OBJS)

以及调用它们的 makefile(与 src 相同的文件夹):

CC  := g++

BASEDIR := src
PROJN := disquerango
MODULES := clients couriers products read requests disquerango
OBJS := $(addprefix $(BASEDIR)/,$(MODULES))

all: compila run limpa

compila:
for dir in $(OBJS); do (cd $$dir; ${MAKE} all); done

run: compila
./$(BASEDIR)/$(PROJN)/disquer -e entregadores.csv -c cardapio.csv

limpa:
rm -f $(BASEDIR)/$(PROJN)/disquer
for dir in $(OBJS); do (cd $$dir; rm -f *.o); done

最佳答案

这可能需要几次迭代。 您必须从小而简单的地方开始,逐步发展到大而复杂的地方。

首先,自己创建bin/

现在编写一个可以构建一个目标文件的makefile:

bin/DisqueRango.o: src/DisqueRango.cpp
g++ -c src/DisqueRango.cpp -o bin/DisqueRango.o

开始工作,了解它是如何工作的,发表评论告诉我们结果,我们将继续。

编辑:

源/客户/生成文件:

CC := g++

OBJ = *.cpp

all: prog

prog:
$(CC) -c $(OBJ)

这个 makefile 有效但粗糙。它会在每次运行时重建所有对象,即使它们已经是最新的。我们可以添加另一个命令,mv *.o ../../bin,这会将它们全部放入 bin/,但我认为最好改进现在是基本结构,而 clients 代码库仍然很简单。

语句OBJ = *.cpp给变量OBJ赋值*.cpp;在 shell 命令中使用变量之前,通配符不会被扩展。要将文件列表分配给变量,我们使用 wildcard功能。要将源文件列表 (foo.cpp) 转换为目标文件列表 (foo.o),我们使用 patsubst功能。为了构建目标文件,我们使用 pattern rule , 在该规则中我们使用 automatic variables引用源文件 (foo.cpp) 和目标文件 (foo.o)。

CC := g++

SRC := $(wildcard *.cpp) # foo.cpp bar.cpp baz.cpp
OBJ := $(patsubst %.cpp,%.o,$(SRC)) # foo.o bar.o baz.o

all: $(OBJ)

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

测试那么多以验证它是否有效。现在让这个 makefile 将目标文件放在 bin/ 中,我们做一个小改动:

CC := g++
BIN := ../../bin


SRC := $(wildcard *.cpp)
OBJ := $(patsubst %.cpp,$(BIN)/%.o,$(SRC))

all: $(OBJ)

$(BIN)/%.o: %.cpp
$(CC) -c $< -o $@

验证这么多工作,我们将继续src/disquerango/makefile

关于c++ - 在应用程序中使用不同的文件夹构建 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21837289/

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