我正在通过一个例如pgm来创建一个make文件.
http://mrbook.org/tutorials/make/
我的文件夹eg_make_creation包含以下文件,
desktop:~/eg_make_creation$ ls
factorial.c functions.h hello hello.c main.c Makefile
Run Code Online (Sandbox Code Playgroud)
# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall
all:hello
hello:main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
main.o:main.c
$(CC) $(CFLAGS) main.c
factorial.o:factorial.c
$(CC) $(CFLAGS) factorial.c
hello.o:hello.c
$(CC) $(CFLAGS) hello.c
clean:
rm -rf *o hello
Run Code Online (Sandbox Code Playgroud)
错误:
desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.
Run Code Online (Sandbox Code Playgroud)
请帮我理解编译这个程序.
Vir*_*VDX 103
有时在makefile规则中的命令之前的空格而不是tab中,"没有什么可以为所有人做"错误可能是由空格引起的.请确保在规则中使用制表符而不是空格.
all:
<\t>$(CC) $(CFLAGS) ...
Run Code Online (Sandbox Code Playgroud)
代替
all:
$(CC) $(CFLAGS) ...
Run Code Online (Sandbox Code Playgroud)
有关规则语法说明,请参阅GNU make手册:https://www.gnu.org/software/make/manual/make.html#Rule-Syntax
wee*_*ens 30
从hello文件夹中删除该文件,然后重试.
该all目标依赖于hello目标.该hello目标首先尝试找到文件系统中的相应文件.如果它找到它并且它与依赖文件是最新的 - 那么无所事事.
Che*_*ath 20
当你只是make,它会在你的makefile中创建第一个规则,即"all".您已指定"all"取决于"hello",这取决于main.o,factorial.o和hello.o.所以'make'试图查看这些文件是否存在.
如果它们存在,'make'会查看它们的依赖项(例如main.o是否具有依赖项main.c)是否已更改.如果它们已更改,请重建它们,否则跳过规则.类似地,它递归地继续构建已更改的文件,最后运行最顶层的命令,在您的情况下为"all"提供可执行文件,在您的情况下为"hello".
如果他们不在场,请盲目地建立规则下的一切.
来到你的问题,这不是一个错误,但'make'说你的makefile中的每个依赖都是最新的,它不需要做任何事情!
Aar*_*aid 14
Make表现正常.hello已经存在并且不比.c文件旧,因此没有更多的工作要做.有四种情况需要(重新)构建make:
.c文件,那么它将比您更新hello,然后在运行make时必须重建.hello,那么显然必须重建它-B选项强制make重建所有内容.make -B allmake clean all将删除hello并要求重建.(我建议你看看@Mat的评论rm -f *.o hello根据 Paul R 的评论,我发现
make clean
Run Code Online (Sandbox Code Playgroud)
其次是
make
Run Code Online (Sandbox Code Playgroud)
或者
make all
Run Code Online (Sandbox Code Playgroud)
解决了我的问题。
小智 5
这不是错误;unix 中的 make 命令基于时间戳工作。也就是说,如果您对使用进行了某些更改factorial.cpp和编译,make那么 make 会显示仅cc -o factorial.cpp执行命令的信息。下次如果您执行相同的命令,即make没有对任何带有.cpp扩展名的文件进行任何更改,编译器会说输出文件是最新的。编译器会提供此信息,直到我们对任何file.cpp.
的优点makefile是它通过只编译被修改.o的文件和直接使用未修改文件的目标 ( ) 文件来减少重新编译的时间。