我正在使用 CentOS 编写 Makefile 以从 C 程序生成这些文件:
hello.i
(修改后的源程序,文本)hello.s
(汇编程序,文本)hello.o
(可重定位目标程序,二进制)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
声明了 hello
和 hello.s
是必需的。然后 make
使用给定的命令生成它们。 Hello
声明 hello.o
是必需的,因此它也会查看给定的命令来生成它。
hello.o
和 hello.o
声明 hello.c
是必需的,所以 make
会检查如果它找到文件并且是,它将运行 gcc
命令。现在生成了 hello.o
,它将返回生成 hello
。
命令应使用适当的制表符缩进,因此如果您复制粘贴,请检查您是否有制表符且没有多个空格。
关于c - 编写 Makefile 以从 C 程序生成修改后的、汇编的、可重定位的和可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58042357/