我有一个看起来像这样的 makefile
all: all_functions
all_functions: a_functions.o b_functions.o c_functions.o d_functions.o main.o a.h b.h c.h d.h main.h
gcc -o program1 a_functions.o b_functions.o c_functions.o d_functions.o main.o
a_functions.o: a_functions.c a.h
gcc -c -o a_functions.o a_functions.c
b_functions.o: b_functions.c b.h
gcc -c -o b_functions.o b_functions.c
c_functions.o: c_functions.c c.h
gcc -c -o c_functions.o c_functions.c
d_functions.o: d_functions.c d.h
gcc -c -o d_functions.o d_functions.c
main.o: main.c main.h
gcc -c -o main.o main.c
clean:
rm *.o program1
install:
cp ./program1 "/usr/local/program1"
uninstall:
rm "/usr/local/program1"
我在 makefile 中使用了制表符而不是空格。当我这样做时make -f Makefile
,makefile 每次都会编译并创建program1,即使文件存在并且没有进行任何更改。我的 makefile 有什么问题?我希望看到一条错误消息“make:Nothing to be do for..”
答案1
你正在使用虚假目标,IE具有有用名称但其配方不会产生目标的目标。也就是说,make
最终尝试构建all_functions
目标,但关联的配方不会构建任何名为 的内容all_functions
。
如果将前两行替换为
all: program1
program1: a_functions.o b_functions.o c_functions.o d_functions.o main.o a.h b.h c.h d.h main.h
您应该会发现它的make
行为符合您的预期。