linux - Makefile 不生成目标代码或可执行文件

标签 linux object makefile terminal executable

我正在尝试编写一个从 .c 文件生成汇编代码、目标代码和可执行文件的联编文件。这是我的 makefile 的内容:

good_echo.s: good_echo.c
    gcc -S -fstack-protector-all good_echo.c
good_echo.o: good_echo.s
    gcc -S good_echo.s -o good_echo.o
good_echo: good_echo.o
    gcc -v good_echo.o -o good_echo
clean:
    rm -f good_echo.o good_echo.s good_echo 

当我在终端输入 make 时,它​​只生成汇编代码。谁能解释一下这是怎么回事?

最佳答案

如果您查看 GNU make 手册 How make Processes a Makefile你会注意到这句话:

make reads the makefile in the current directory and begins by processing the first rule.

在下一段中紧随其后:

If some other rule is not depended on by the goal (or anything it depends on, etc.), that rule is not processed, unless you tell make to do so (with a command such as make clean).

这里你的第一条规则说要构建 good_echo.s,其他目标都不是它的先决条件,所以它是唯一构建的。

如果你运行 make good_echo 那么所有的都将被构建。或者,您可以确保构建目标 good_echo 的规则是您的 makefile 中的第一个规则。

或者,您可以使用常用的习语并创建目标 all 作为第一个规则,这取决于您要生成的内容:

all: good_echo

需要明确的是,除了 makefile 中的第一条规则之外,规则的定义顺序并不重要。

预计到达时间

正如 Joseph Quinsey 在评论中所指出的,您的规则是:

good_echo.o: good_echo.s
        gcc -S good_echo.s -o good_echo.o

不正确。 -S 选项告诉编译器在生成程序集后停止并将其写出,但已经将程序集作为输入。你想要一个目标文件,所以你应该使用 -c 选项告诉编译器在生成目标文件后停止(而不是尝试链接):

good_echo.o: good_echo.s
        gcc -c good_echo.s -o good_echo.o

更清楚一点:编译器可以通过使用文件扩展名来推断它提供的输入类型(在这种情况下,.s 表示汇编)--或者如果您愿意,您可以使用 -x 选项强制它——但它不会推断您想要的输出类型:您总是必须告诉它-c-S-E 等选项。如果您不使用其中任何一个,那么它将运行所有步骤并尝试生成一个可执行程序。

关于linux - Makefile 不生成目标代码或可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52749838/

相关文章:

c - 消息队列支持多线程吗?

linux - 监视/var/log/messages 文件中的特定关键字

javascript - fabricjs,非 Windows 操作系统中剪辑区域的不同大小和坐标

javascript - 我试图为 Object 设计一个 length() 方法的原型(prototype)并破坏了 jQuery——怎么做到的?

c++ - 链接程序时是否需要重复编译标志?

Linux - 默认 OpenGL 版本

javascript - 更改 HTML 中对象标记的数据内容

javascript - 如何根据子属性将 JSON 排序到数组中

c++ - 构建文件夹和makefile

makefile - 在处理完文件中的所有目标后,如何编写一个 makefile 来运行 shell 命令?