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

标签 c++ makefile

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

相关文章:

c++ - 如何在 Qt 中分离发布和调试版本?

makefile - Makefile将命令输出分配给变量

c++ - 为什么我必须在链接器行的末尾传递库?

c++ - 十进制到IEEE单精度 float

java - (JNI) 使用GetMethodID获取Java方法的内存地址

c++ - 为什么动态内存分配(堆)出现运行时错误?

c++ - c++ 程序员应该了解 linux 文件系统上的哪些重要目录?

makefile - QtCreator .pro 文件中的 *= 是什么意思?

shell - 如何将 shell 变量传递给 autogen.sh 脚本

c - Makefile: '_start'的多重定义