gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:40 24 4
gpt4 key购买 nike

我正在尝试编写一个从 .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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com