C++ Makefile子目录帮助-控制对象的放置位置
我有一个关于生成文件的快速问题。我做了一些搜索,但是每个人的makefile都是如此的不同,除非你真的很了解make系统,否则很难理解,而我真的不知道 因此,强制我调用makefile,如下所示:C++ Makefile子目录帮助-控制对象的放置位置,c++,makefile,C++,Makefile,我有一个关于生成文件的快速问题。我做了一些搜索,但是每个人的makefile都是如此的不同,除非你真的很了解make系统,否则很难理解,而我真的不知道 因此,强制我调用makefile,如下所示: make -f /path/to/src/Makefile "SRCPATH=/path/to/src" 这样(理想情况下)来自不同makefile的所有对象都会在同一个地方结束,因为它是从类似/some/path/objects\u C 我的目录结构如下所示: src/ Makefile
make -f /path/to/src/Makefile "SRCPATH=/path/to/src"
这样(理想情况下)来自不同makefile的所有对象都会在同一个地方结束,因为它是从类似/some/path/objects\u 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) $<
subbjs:=subsrc1.o subsrc2.o subsrc3.o
$(子对象):%.o:$(SRCPATH)/src_subdir/%.cpp
$(CXX)$(CXXFLAGS)$(CPPFLAGS)$(目标搜索)-c$(输出搜索选项)$<
这两种方法将产生完全相同的结果,但是像这样使用vpath
将所有对象文件合并在一起的缺点是,如果文件夹具有相同的源文件名,则可能会混淆make。因为你似乎是自己管理名字,所以这不应该是个问题
第二种方法更安全,只需编写自己的规则和食谱,这会带来一些小麻烦
如果可能,您应该在构建目录中复制源目录树,因为它大大简化了生成文件。“这样(理想情况下)来自不同生成文件的所有对象最终都位于同一位置”您是指同一目录中的所有.o文件,还是同一目录树中的所有.o文件?因为将它们放在同一个目录中会带来麻烦,因为除非您对名称进行微观管理,否则两个对象可能具有相同的名称。@user657267我完全理解您的来历,但这是定义此生成系统和标准实践的情况之一,并且是更大生成系统的一部分,尽管正如你所说,这可能会导致问题。我会记住这一点并提出它,但在不作广泛更改的情况下,它现在将保持这种方式。”但是
subsrc.o
文件位于/path/to/src/sub_src
“你是说/path/to/src/src_subdir
?@user657267-是的,我很抱歉,在我删除上下文并概括总结时,我犯了一个错误。我会编辑,但我的意思是sub_src和src_subdir是一样的。该死,我真的以为我试过了!但它当然像一个符咒。当它可用时,我将接受。如果你不介意的话,你能简要描述一下第二种方法是如何工作的和/或你给出的第一种和第二种方法之间的区别(可能还有其含义)?不管怎样,非常感谢,我感谢你的帮助。我会做一些实验。再次感谢您的解释和帮助!感谢您的编辑,我学到了更多…直到CPP标志!=C++flags@prelic您使用ld
而不是ar
进行归档的原因是什么?关于ar
文件和make,有几个巧妙的技巧。我今天只是在谷歌上搜索一下,因为我们的make文件有一半使用ld,另一半使用ar。我读到的信息表明,使用ld的好处是,未使用的符号/对象将被排除在库之外,而ar将始终构建完整的存档。也就是说,我很想听听你对这件事的看法。