首页 文章

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

提问于
浏览
2

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

  • 0

    要检查的第一件事是文件 ../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特有的)

  • 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,而不是按顺序运行它们 .

  • 1

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

    • 链接规则不应该在Makefile3中,因为Makefile3无法在Algorithm /和exe /中创建对象,它应该在主Makefile中 .

    • 在Scott Wales的帮助下,您修复了特定的路径问题(我的猜测"../LOD1/Algorithm"应该是"../Algorithm"),但一般情况下,您不应该将路径硬编码到这样的目标中 .

    • 您可以使用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 $@ $^
    

相关问题