【问题标题】:Separating objects and source with a makefile使用 makefile 分离对象和源
【发布时间】:2009-06-19 00:11:25
【问题描述】:

我一直无法让我的 makefile 以我想要的方式工作。首先,我想说这是 POSIX make,就像在 http://www.opengroup.org/onlinepubs/009695399/utilities/make.html 中一样,我需要我的构建系统同时使用 BSD 和 GNUs(Linux)。

我想要的是一个零维护的 makefile。我希望它只编译 src/ 中的所有 .c 和 .asm 文件,并将目标文件放在 objs/ 中,然后将 objs/ 中的所有内容链接到二进制文件。

我可以做很多事情,但我无法将源文件和 obj 文件分开。

如果这需要一点内置的 shell 脚本(使用 POSIX 定义的 /bin/sh),我可以,但我不能让依赖项正常工作。如果源文件较新,我希望它只构建目标文件。

我最接近的是:

${C_OBJS}: ${HDRS} ${*:objs/%=src/%}.c ${CC} ${CFLAGS} -c ${*:objs/%=src/%}.c -o $*.o

这有一个问题,我仍然必须指定 C_OBJS=objs/foo.o 等等,而且它几乎不是 POSIX,因此可以使用 BSD make 而不是 GNU make 编译。

【问题讨论】:

    标签: makefile posix sh


    【解决方案1】:

    make 的 POSIX 版本不明确支持其中包含斜杠的文件名,也没有规定将不同目录中的源文件与目标文件分开。而且,正如@caskey 所指出的,它不支持使用“%”字符的任何表示法,尽管它指出存在此类规则并建议保留它们以用作元字符。

    因此,您可能无法使用标准 POSIX make 做您想做的事情。

    在实践中,您通常可以使用 make 的特定实现来做您想要做的事情,但生成的 makefile 的可移植性有限。

    考虑使用某种生成文件生成系统 - cmake 或自动工具(autoconflibtoolautomake 等)。或者是make的基本概念的众多返工之一:

    • scons
    • 蚂蚁
    • 蛋糕
    • 做饭
    • 胸罩
    • ...还有一打我忘记或没听说过的...

    【讨论】:

      【解决方案2】:

      POSIX make 不支持类似的结构?

        objs/%.o : src/%.c
          ${CC} ${CFLAGS} -c $< -o $@
      

      忘了最后的问号,希望能让我的评论更清楚。

      【讨论】:

      • 这是讽刺吗?我想我可以只支持 BSD 和 GNU make,这似乎适用于 GNU make,而且我认为“接近”在 BSD make 上工作..
      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 2015-06-05
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多