我有一个关于我有的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做基础时,它会让我觉得自己再次成为初学者。
答案 0 :(得分:1)
如果您想依赖内置规则,则需要修改vpath
。
子目标对象被定义为/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
。
Pedantry警报:-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。