我的项目中有以下目录结构:
bin/
dist/
include/
├── module_a/
└── module_b/
Makefile
src/
├── module_a/
└── module_b/
文件夹include/
包含*.hpp
's while *.cpp
's are in 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/
?我不想D_BIN = ../../bin
在 Makefile 中有类似的东西。