gpt4 book ai didi

makefile - Makefile 的良好实践

转载 作者:行者123 更新时间:2023-12-03 06:44:33 26 4
gpt4 key购买 nike

我的项目中有以下目录结构:

bin/
dist/
include/
├── module_a/
└── module_b/
Makefile
src/
├── module_a/
└── module_b/

文件夹include/包含*.hpp,而*.cpp位于src/ 。我想将所有源代码编译到 bin/ ,然后将它们链接到 dist/ 。对我来说这似乎是一个相当合理的愿望。

我想知道针对这种情况的 Makefile 的最佳实践。我所能找到的只是 %.o: %.cpp 目标,但这并没有真正起作用,因为源和二进制文件夹不同。

我试图使用这样的东西:

D_SRC = src
D_BIN=bin

F_CPP := $(shell find $(D_SRC) -iname '*.cpp' -type f)
F_OBJ := $(shell echo $(F_CPP) | sed s:\ :\\n:g | sed s:$(D_SRC):$(D_BIN): | sed 's:^\(.*\)\.cpp$$:\1\.o:')

$(F_OBJ): $(F_SRC)
$(foreach file, $(F_SRC), \
$(GXX) $(CXXFLAGS) -c $(file)\
)

此目标不起作用,因为 $(F_OBJ) 路径以 bin/ 开头,而 foreach 将源代码编译到当前工作目录。我可以将其编译为 bin/,但只有再添加几个 sed 表达式才会发生这种情况,而且它本身就够难看的了。

这对我来说可能很难,因为我不太了解make,但我不能是唯一一个设置这个项目的人。在我看来,这一定是一种很常见的现象。我知道我可以分别为每个模块编写一个 Makefile,但这真的是最好的选择吗?

编辑:我现在想知道使用几个 Makefile 可以实现什么目标。如果一个位于根目录,另一个位于 src/module_a 中,后者如何知道 bin/ ?如果您使用 make -f src/module_a/Makefile 执行它,它将与从根目录执行它相同,因为它的工作目录将是根目录。我想,另一种方法是在执行之前更改目录,如下所示:make -C include/module_a,但在这种情况下,它将如何找到bin/?我不想在 Makefile 中包含类似 D_BIN = ../../bin 的内容。

最佳答案

我通常做的是在 src 目录中有一个 Makefile(如果您愿意,可以从顶层 Makefile 调用),然后使用如下规则:

D_BIN = ../bin
$(D_BIN)/%.o: %.cpp

您还可以仅在顶级目录中尝试一个 makefile,并使用如下所示的规则:

D_BIN = bin
D_SRC = src
$(D_BIN)/%.o: $(D_SRC)/%.cpp

但我没有使用过这样的规则,所以我不知道与我通常的方式相比的优点/缺点。我通常的方式工作得很好,我什至有构建依赖的规则,如下所示:

$(D_BIN)/%.d: %.cpp 

链接规则如下:

../dist/outexe: $(F_OBJ)

使用 foreach 通常不受欢迎,因为它没有利用普通 makefile 规则中内置的所有功能(即,没有基于每个文件的依赖检查,要么构建所有内容,要么什么也不构建),因此 foreach应该只用作最后的手段,但在这种情况下,您将能够在没有 foreach 的情况下让它工作。

除此之外,还有更简单的方法来构建文件列表,您不需要使用 shell 或 sed。

F_CPP = $(wildcard *.cpp)
F_OBJ = $(F_CPP:.cpp=.o)

更新:这是我通常发出递归 make 的方式:

SUBDIRS = src
.PHONY: $(SUBDIRS)
all: $(SUBDIRS)

$(SUBDIRS):
@echo "Building $@..."
$(MAKE) -C $@ $(MFLAGS)

那么实际上在您的子制作中,您需要使用 ../bin 例如。

但是,对于像您这样简单的项目,您最好在根级别使用一个 makefile 并使用如下规则:

D_BIN = bin
D_SRC = src
$(D_BIN)/%.o: $(D_SRC)/%.cpp

如果您有一个非常复杂的目录结构,并且随着时间的推移,您将在其中添加/删除/修改新的目录树,则递归生成文件是可以的(可以但不是很好)。但对于一个简单的项目,您只想为代码和 obj 建立单独的目录,这可能有点过分了。

关于makefile - Makefile 的良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688651/

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