GCC链接时间错误 - 没有规则来制定目标

时间:2010-04-16 12:57:03

标签: c gcc makefile linker

我是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

3 个答案:

答案 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)

听起来好像斯科特威尔士的建议解决了你的问题,但我还会添加其他一些东西。

  1. 链接规则不应该在Makefile3中,因为Makefile3无法在Algorithm /和exe /中创建对象,它应该在主Makefile中。
  2. 在Scott Wales的帮助下,您修复了特定的路径问题(我的猜测是“../LOD1/Algorithm”应该是“../Algorithm”),但是一般来说,你不应该将路径硬编码到这样的目标中。
  3. 您可以使用automatic variables(例如$ ^)来消除一些冗余。
#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,而不是按顺序运行它们。