c - 编写 Makefile 以从 C 程序生成修改后的、汇编的、可重定位的和可执行文件

标签 c gcc makefile

我正在使用 CentOS 编写 Makefile 以从 C 程序生成这些文件:

  1. hello.i(修改后的源程序,文本)
  2. hello.s(汇编程序,文本)
  3. hello.o(可重定位目标程序,二进制)
  4. hello(可执行目标程序,二进制)

想法是打开每个文件以查看其内容。

C 程序(称为 hello.c)

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}

生成文件

all: hello

hello:
      gcc -I hello.c -o hello.i

hello.o:
      gcc -c hello.c -o hello.o

hello.s:
      gcc -S hello.i -o hello.s

hello.i:
      gcc ???

clean:
      rm -rf *.o hello

此外,还有一个清除所有内容的干净命令。

我收到的错误:make all

compilation terminated. make: *** [hello] Error 4

我知道有一个命令可以一次生成所有内容,但是,我想逐步完成。这是我尝试做的第一个 Makefile,但我还不是 100% 熟悉。

我做错了什么,可能是错误的标志?

我的目标是生成上面提到的所有文件以打开它们并查看它们的内容。

最佳答案

如果没有 hello.i,我不清楚它应该是什么,您的 make 文件应该如下所示:

all: hello hello.s

hello: hello.c hello.o
    gcc hello.o -o hello

hello.o: hello.c
    gcc -c hello.c -o hello.o

hello.s: hello.c
    gcc -S hello.c -o hello.s

clean:
    rm -rf *.o

您的问题是,在 Makefile 中,您应该在分号之后指明依赖项(需要生成当前输出的文件)。

在你的例子中,all 声明了 hellohello.s 是必需的。然后 make 使用给定的命令生成它们。 Hello 声明 hello.o 是必需的,因此它也会查看给定的命令来生成它。

hello.ohello.o 声明 hello.c 是必需的,所以 make 会检查如果它找到文件并且是,它将运行 gcc 命令。现在生成了 hello.o,它将返回生成 hello

命令应使用适当的制表符缩进,因此如果您复制粘贴,请检查您是否有制表符且没有多个空格。

关于c - 编写 Makefile 以从 C 程序生成修改后的、汇编的、可重定位的和可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58042357/

相关文章:

c++ - G++ 不清楚的编译失败

c - 不兼容的指针类型和返回使得整数没有强制转换问题

c - 为什么优化器会修复我的程序?

无法使用 gcc-7 编译

与 pthread 的 C++11 链接问题

c - 如何编译 GnuTLS

c++ - 无法在 Ubuntu 16.04 上安装 levmar(C/C++ 中的 Levenberg-Marquardt 非线性最小二乘算法)

c++ - 解码字符数组

c - MPI代码链接错误: undefined reference to `ceil'

c - 由于 libffi 中 undefined reference ,构建 Glib 时出错