c++ - Makefile 子目录帮助——控制对象的放置位置

标签 c++ makefile

我有一个关于我的 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.osrc2.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/

相关文章:

python - 在 OS X 上安装 memcached 以与 django (python) 一起使用

error-handling - 如何捕捉和处理 Make 中的错误?

c++ - g++ 编译时出现 undefined reference 错误

c++ - 为什么下面的代码给我一个关于抽象类的错误?

c - 将 .so 文件链接成可执行文件

c++ - Qt Creator 2.8.1 Qt 5.1.1 Qt Designer Linux 显示新窗体

c++ - 出于对象替换的目的,对象的 "name"究竟是由什么构成的?

c++ - C++ Makefile错误(openGl)

c++ - Bullet 3 动力学不适用于非球体

c++ - 在从不再加载的动态库实例化的对象上使用在主代码库中定义的模板类方法时出现段错误