我有下面的 makefile 和一个目录树:
->project/src/main.c, func.c, 生成文件
->项目/exe/
->项目/公司/
->项目/对象/
cc=gcc
cflags=-c
obj=../obj
exe=../exe
inc=../inc
prog.exe: main.o func.o
$(cc) main.o func.o -o $(exe)/prog.exe
main.o: main.c $(inc)/defs.h
$(cc) $(cflags) main.c
mv main.o $(obj)/
func.o: func.c $(inc)/defs.h
$(cc) $(cflags) func.c
mv func.o $(obj)/
问题是,main.o 和 func.o(以 mv 开头的)下面的第二个操作不起作用(即 main.o 未移至/obj 目录)。是不是makefile的语法或者其他的有问题?
最佳答案
一个明显的问题是 makefile 没有构建它应该构建的目标。即:
prog.exe: main.o func.o
$(cc) main.o func.o -o $(exe)/prog.exe
不构建 prog.exe
,而是构建 $(exe)/prog.exe
,这是一个不同的文件。解决办法是:
$(exe)/prog.exe: $(obj)/main.o $(obj)/func.o
$(cc) $^ -o $@
更喜欢使用 automatic variables用于输入和输出文件的名称,以避免重复和愚蠢的拼写错误。
关于linux - 为包含一些已安排文件夹的项目编写 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9486199/