我是Makefile写作世界的新手 . 我有一个C项目,我想用GCC构建,我可以编写一个非常好的Makefile,它调用 3 other Makefiles ,递归地呈现项目的 in different directory structure ,然后将相应的源文件发送到GCC编译器 . 这一步的结果是我能够看到所有 (5) object files of (5) source files .
对象文件名(按其生成顺序) -
Makefile1
imageprocessing.o(1)
morpho.o(2)
PivBlb.o(3)
Makefile2
main.o(4)
Makefile3
bmp.o(5)
在看到所有预期的目标文件的信心下 . 我现在在 Makefile3 中添加其他规则,以链接所有目标文件,此处链接器将开始给出错误部分,如 below 所示 .
不仅如此,之前生成的 last object file (bmp.o(5))已经生成了 NOT ,我对最后一个makefile的新更新引起了我的猜测 .
这里发生了什么事?任何 hints ,好吗?
我也只粘贴 the last Makefile - Makefile3 的内容,其中存在链接规则, below the Errors section .
谢谢
-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
3 回答
要检查的第一件事是文件
../LOD1/Algorithm/imageprocessing.o
实际存在且路径正确,因为make抱怨它无法找到 .你自己在其他目录中运行make吗?如果没有,你应该添加像
到你的主要makefile .
另外,作为检查,您可以定义last result规则以列出Make无法找到的内容,例如
(这可能是GNU make特有的)
从您的错误输出,它看起来像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,而不是按顺序运行它们 .
这听起来似乎斯科特威尔士的建议解决了你的问题,但我还会添加其他一些东西 .
链接规则不应该在Makefile3中,因为Makefile3无法在Algorithm /和exe /中创建对象,它应该在主Makefile中 .
在Scott Wales的帮助下,您修复了特定的路径问题(我的猜测"../LOD1/Algorithm"应该是"../Algorithm"),但一般情况下,您不应该将路径硬编码到这样的目标中 .
您可以使用automatic variables消除一些冗余,例如$ ^ .