的良好做法我有我的项目目录结构如下:的Makefile
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
,但这真的是最好的选择吗?
编辑︰我现在想知道我会用几个Makefiles实现什么。如果有人在src/module_a
的根目录中,那么后者将如何知道bin/
?如果你使用make -f src/module_a/Makefile
执行它,它将与从根目录执行它相同,因为它的工作目录将是根目录。另一种方式,我想,将执行它之前改变目录,如下所示:make -C include/module_a
,但在这种情况下,它将如何找到bin/
?我不想在Makefile中有类似D_BIN = ../../bin
的东西。
更新了我的答案... –