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