我正在尝试为我的项目创建一个 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/