【问题标题】:Why does my GNU make skip making an object file (%.o) when building an %.s (assembler) program?为什么我的 GNU 在构建 %.s(汇编程序)程序时会跳过创建目标文件(%.o)?
【发布时间】:2015-02-14 15:23:11
【问题描述】:

我只使用隐式规则 - 完全删除 makefile 以获得最小的测试用例。我有一个空的(GNU 汇编器没问题)program.s 文件。执行:

make program

给我 make 的以下输出:

cc    program.s   -o program

(当然还有预期的错误,这对问题无关紧要:因为我的汇编源文件是空的,所以没有“_start”并且各种链接都失败了。)

我想知道,为什么make会选择尝试一次性构建程序?而不是先使用as program.s ...,然后使用ld program.o ...?这是因为它认为在我的场景中不需要目标文件吗?

如果我执行make program.o,则调用as program.as ...,按预期生成我的program.o

【问题讨论】:

    标签: gcc assembly makefile gnu-make


    【解决方案1】:

    Make 将始终选择one-step implicit rules 而不是多步隐式规则,以获得相同的结果。在这种情况下,make 包含内置规则,这些规则既可以从目标文件创建可执行文件,也可以直接从各种源文件(包括程序集)创建可执行文件:

    %: %.s
    #  recipe to execute (built-in):
            $(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@
    

    由于这比首先构建.o 然后从.o 构建可执行文件要短,并且由于您的makefile 没有说您需要.o,因此make 使用最短的步骤集。

    【讨论】:

    • 谢谢你,先生。疯狂的科学家。我刚刚通过make -pn program 找到了有问题的隐含规则。
    • 查看整个内置规则库最简单的方法是运行make -p -f /dev/null
    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多