我正在尝试编写一个Makefile,该文件从.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时,它仅生成汇编代码。有人可以解释发生了什么事吗?
答案 0 :(得分:2)
如果您查看GNU make手册How make Processes a Makefile,您会注意到这句话:
make读取当前目录中的makefile,并从处理第一条规则开始。
接下来的段落中
如果目标不依赖其他规则(或它所依赖的任何东西,等等),则不会处理该规则,除非您告知make这样做(使用make clean等命令)。
您的第一条规则说要建立good_echo.s
,而其他目标都不是先决条件,因此这是唯一建立的目标。
如果您运行make good_echo
,则将全部构建。另外,您可以确保构建目标good_echo
的规则是您的Makefile中的 first 规则。
或者,您可以使用常用的惯用法并根据您要生成的内容创建目标all
作为第一条规则:
all: good_echo
要清楚,除了makefile中的第一条规则外,定义规则的顺序并不重要。
ETA
正如约瑟夫·昆西(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
更清楚的是:编译器可以通过使用文件扩展名来推断它是哪种类型的 input (在这种情况下,.s
表示汇编),也可以强制执行如果愿意,可以使用-x
选项来显示它-但是它不会推断出您想要的 output 的类型:您总是必须使用-c
这样的选项来告诉它,-S
和-E
。如果您不使用其中任何一个,它将运行所有步骤并尝试生成可执行程序。