Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Makefile子目录帮助-控制对象的放置位置_C++_Makefile - Fatal编程技术网

C++ 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

我有一个关于生成文件的快速问题。我做了一些搜索,但是每个人的makefile都是如此的不同,除非你真的很了解make系统,否则很难理解,而我真的不知道

因此,强制我调用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将始终构建完整的存档。也就是说,我很想听听你对这件事的看法。