【问题标题】:Makefile not generating object code or executableMakefile 不生成目标代码或可执行文件
【发布时间】:2018-10-10 22:51:34
【问题描述】:

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

【问题讨论】:

  • 你能显示你输入的实际 make 命令和你得到的输出吗(我的意思是剪切和粘贴未解释的实际文本)?
  • 我在终端中输入的命令字面意思是“make”。我得到的输出是“gcc -S -fstack-protector-all good_echo.c”。当我检查文件夹内容时,只添加了 .s 文件
  • 啊哈,不过你已经更新了makefile;它与您最初发布时的不同。
  • 是的,我在看到您的回复之前就这样做了。我的道歉

标签: linux object makefile terminal executable


【解决方案1】:

如果你查看 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 中的第一条规则之外,定义规则的顺序并不重要。

预计到达时间

正如 Joseph Quinsey 在 cmets 中指出的,您的规则在这里:

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 选项,如果你愿意的话——但它不会推断出你想要的 输出 的类型:你总是必须告诉它使用诸如 -c-S-E。如果您不使用其中任何一个,那么它将运行所有步骤并尝试生成可执行程序。

【讨论】:

  • 非常感谢您的回复。对此,我真的非常感激。我已经在我的程序中添加了 all: good echo 并且我得到了“gcc -S -fstack-protector-all good_echo.c / gcc -S good_echo.s -o good_echo.o / gcc -v good_echo. o -o good_echo / gcc: good_echo.o: 没有这样的文件或目录/使用内置规范......"
  • @chloapsoap:gcc 手册说"-S ... do not assemble"。所以命令gcc -S good_echo.s -o good_echo.o 对我来说看起来很奇怪(但我还没有测试过)。
猜你喜欢
  • 2011-10-14
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多