我有一个关于我的 makefile 的快速问题。我进行了一些搜索,但每个人的 makefile 都如此不同,除非您真的很了解 make 系统,否则很难理解,而我真的不了解。
因此,强制要求我的 makefile 被称为:
make -f /path/to/src/Makefile "SRCPATH=/path/to/src"
这样(理想情况下)来自不同 makefile 的所有对象最终都在同一个地方,因为这是从类似 /some/path/Objects_C
我的目录结构是这样的:
src/
Makefile
src1.cpp
src2.cpp
src3.cpp
src/src_subdir
subsrc1.cpp
subsrc2.cpp
subsrc3.cpp
由于依赖关系,我不能有两个 makefile,在上下文中,不这样做更有意义。
无论如何,我的 makefile 很简单,它看起来像:
SRCPATH ?= .
INCLUDES = -I$.......(all my include paths)
vpath % $(SRCPATH)
CPPFLAGS = -g $(INCLUDES)
OBJS = src1.o \
src2.o \
src3.o \
$(SRCPATH)/src_subdir/subsrc1.o \
$(SRCPATH)/src_subdir/subsrc2.o \
$(SRCPATH)/src_subdir/subsrc3.o
.PHONY : clean all
# ====================================================
libname.a : $(OBJS)
ld -r $(OBJS) -o $@
# ====================================================
现在,我得到了我想要的一半...顶级 src1.o
、src2.o
和 src3.o
出现在我想要的地方(make 运行的地方,Objects_C 目录),但是 subsrc.o
文件位于 /path/to/src/src_subdir
。我是不是漏掉了一些简单的东西,还是我完全在胡思乱想?
非常感谢任何帮助!每次我觉得我可以用 make 做基础时,它让我觉得自己又是一个初学者。
最佳答案
如果您想依赖内置规则,您需要修改您的 vpath
。
subdir 对象被定义为 /path/to/src/src_subdir/subsrc1.o
等,所以这将是它们结束的地方也就不足为奇了。如果您希望这些对象与其他对象出现在同一位置,您需要这样说
OBJS = src1.o \
src2.o \
src3.o \
subsrc1.o \
subsrc2.o \
subsrc3.o
现在剩下的就是通知make在哪里可以找到subsrc*.o
vpath %.cpp $(SRCPATH) $(SRCPATH)/src_subdir
正如我所说,您需要确保相应地管理您的文件名,否则您将会遇到麻烦。我还更改了 vpath
模式,因为看起来您现在只需要 cpp
。
迂腐警告:-g
是一个编译器标志,而不是预处理器标志,应该在 CXXFLAGS
中。
如果没有 vpath
,另一种选择是提供明确的规则和方法,比如
SUBOBJS := subsrc1.o subsrc2.o subsrc3.o
$(SUBOBJS): %.o: $(SRCPATH)/src_subdir/%.cpp
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $(OUTPUT_OPTION) $<
这两种方法都将产生完全相同的结果,但是像这样使用 vpath
将所有目标文件集中在一起的缺点是,如果文件夹具有相同的源文件名,则可能会混淆 make。由于您似乎是自己管理名称,所以这应该不是问题。
第二种方法更安全,因为必须编写自己的规则和配方带来一些不便。
如果可能,您应该在构建目录中复制源代码树,因为它会大大简化 makefile。
关于c++ - Makefile 子目录帮助——控制对象的放置位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36805668/