2

我正在尝试编译具有以下结构的项目

项目:

  • 生成文件
  • 可执行文件
  • 来源1
    • .cxx
    • 。H
  • 来源2
    • .cxx
    • 。H
  • 建造
    • *.o

而且我很难编写 Makefile 来编译。我目前有如下命令:

Src1 = $(wildcard $(SRCDIR1)/*.cxx)
Obj1 = $(patsubst $(SRCDIR1)/%.cxx, $(OBJDIR)/%.o, $(Src1))

但是后来我很难为目标文件制定编译规则a)因为我不能再做:

$(Obj1): %.cxx
    $(CXX) $(CFLAGS) -c $(@:.o=.cxx) -o $@

因为'$@'命令现在包括构建目录的路径,并且b)因为先决条件现在包括构建路径,我应该有一个源路径。我已阅读大量制作手册以尝试找到解决方案,但没有运气。对解决方案的任何帮助表示赞赏!杰克

4

2 回答 2

0

从个人经验来看,在玩了一些“原始” Makefile 之后,我真的建议使用一些工具为你构建 Makefile,比如automakecmake

您仍然必须手动指定所有源文件 - 但至少我更喜欢手动摆弄 Makefile。

于 2013-08-14T10:26:59.490 回答
0

我更喜欢的一种选择是在构建目录中构建同构目录结构。也就是说,源文件${src_dir}/project_x/main.cxx构建到${build_dir}/project_x/main.o. 这样,当不同源目录中存在同名的源文件时,您可以避免名称冲突。编译器规则如下所示:

${obj_dir}/%.o : ${src_dir}/%.cxx # % includes directory name, e.g. project_x/main
    @-mkdir -p ${@D}
    ${CXX} -c -o $@ ${CPPFLAGS} ${CXXFLAGS} $<

注意上面它是如何动态创建目标目录的。这有点简单,在现实世界的构建系统中,对象文件依赖(使用order-only dependency)其目录,因此make如果目标目录不存在,则自动创建目标目录,而不是推测性地尝试为每个目标对象创建它们文件,即使它已经存在。

于 2013-08-14T10:47:07.263 回答