Makefile无法生成目标代码或可执行文件

时间:2018-10-10 22:51:34

标签: linux object makefile terminal executable

我正在尝试编写一个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时,它仅生成汇编代码。有人可以解释发生了什么事吗?

1 个答案:

答案 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。如果您不使用其中任何一个,它将运行所有步骤并尝试生成可执行程序。