我是Makefile写作世界的新手。我有一个C项目,我想用GCC构建,我可以写一个非常好的Makefile,它调用 3个其他Makefile ,在项目的不同目录结构中显示 ,递归地,谁将相应的源文件发送到GCC编译器。这一步的结果是我能够看到(5)源文件的所有(5)目标文件。
目标文件名(按其生成顺序) -
Makefile1
imageprocessing.o(1)
morpho.o(2)
PivBlb.o(3)
Makefile2
main.o(4)
Makefile3
bmp.o(5)
有信心看到所有预期的目标文件。我现在在 Makefile3 中添加其他规则,以链接所有目标文件,此处链接器将开始提供错误部分,如下面的 所示。
不仅如此,之前生成的最后一个目标文件(bmp.o(5)) NOT 再生成,我的最新更新makefile引起了我的猜测。
这里发生了什么?有任何提示吗?
我也只粘贴最后一个Makefile - Makefile3 的内容,其中存在链接规则,位于错误部分下方。
谢谢
-V
-------------------------------------
**Errors**
make[1]: Entering directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/Algorithm'
make[1]: `all' is up to date.
make[1]: Leaving directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/Algorithm'
make[1]: Entering directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/exe'
make[1]: `all' is up to date.
make[1]: Leaving directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/exe'
make[1]: Entering directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/IO'
make[1]: Leaving directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/IO'
make[1]: *** No rule to make target `../LOD1/Algorithm/imageprocessing.o', needed by `final'. Stop.
make: *[all] Error 2
----------------------------------------
Makefile3
CC = $(TOOLS)/gcc
HFLAG = ../IO/inc
CCFLAGS = -mcpu=$(HW)
OBJ1 = ../LOD1/Algorithm/imageprocessing.o ../LOD1/Algorithm/morpho.o ../LOD1/Algorithm/PivBlb.o
OBJ2 = ../LOD1/exe/main.o
OBJ3 = ../LOD1/IO/bmp.o
all: final
final: ../LOD1/Algorithm/imageprocessing.o ../LOD1/Algorithm/morpho.o ../LOD1/Algorithm/PivBlb.o ../LOD1/exe/main.o ../LOD1/IO/bmp.o
$(CC) -o $@ $(OBJ1) $(OBJ2) $(OBJ3)
bmp.o: src/bmp.c inc/bmp.h
$(CC) $(CCFLAGS) -I$(HFLAG) -c src/bmp.c
clean:
rm -rf *o main.o
答案 0 :(得分:2)
要检查的第一件事是文件../LOD1/Algorithm/imageprocessing.o
实际存在且路径正确,因为make抱怨无法找到它。
你自己在其他目录中运行make吗?如果没有,你应该添加像
这样的规则../LOD1/Algorithm/imageprocessing.o:
$(make) -C ../LOD1/Algorithm imageprocessing.o
到主makefile。
另外,作为检查,您可以定义last result规则以列出Make无法找到的内容,例如
%::
-echo "Make can't find $$(pwd)$@!!!"
(这可能是GNU make特有的)
答案 1 :(得分:1)
听起来好像斯科特威尔士的建议解决了你的问题,但我还会添加其他一些东西。
#MAIN_DIR is /cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1
# or ../LOD1, your choice
vpath %.o $(MAIN_DIR)/Algorithm:$(MAIN_DIR)/exe:$(MAIN_DIR)/IO
.PHONY: all
all: final
final: imageprocessing.o morpho.o PivBlb.o main.o bmp.o
$(CC) -o $@ $^
答案 2 :(得分:0)
从错误输出中,看起来Makefile3在
中执行 /cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/IO
无法找到
/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/IO/../LOD1/Algorithm/imageprocessing.o
如果是这种情况,那么也许
OBJ1 = ../LOD1/Algorithm/imageprocessing.o ../LOD1/Algor..
应改为
OBJ1 = ../Algorithm/imageprocessing.o ../Algor
此外,你应该有一个主Makefile,“包含”其他makefile,而不是按顺序运行它们。