【问题标题】:GCC Linking time errors - No rule to make targetGCC 链接时间错误 - 没有制定目标的规则
【发布时间】:2010-04-16 12:57:03
【问题描述】:

我是 Makefile 写作领域的新手。我有一个想要使用 GCC 构建的 C 项目,我可以编写一个相当不错的 Makefile,它调用 3 个其他 Makefile,存在于项目的 不同目录结构中, 递归地,然后谁将各自的源文件发送到 GCC 编译器。这一步的结果是我可以看到所有(5) 个源文件的(5) 个目标文件

对象文件名(按生成顺序)-

Makefile1

图像处理.o (1)

morpho.o (2)

PivBlb.o (3)

Makefile2

main.o (4)

Makefile3

bmp.o (5)

在看到所有预期的目标文件的信心下。我现在在 Makefile3 中添加附加规则,以链接所有目标文件,此处链接器将开始给出错误部分,如下所示

不仅如此,之前生成的最后一个目标文件(bmp.o(5))现在不再生成了,我的新更新到最后我猜是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

【问题讨论】:

  • "No rule to make target" 是 make 错误,而不是链接器错误。这意味着它找不到该目标文件(它被列为调用链接器的规则的依赖项),并且它无法弄清楚如何创建它。您需要向我们展示应该创建该目标文件的 Makefile 的内容。

标签: c gcc makefile linker


【解决方案1】:

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

【讨论】:

  • 嗨 Scott Wales,您关于 last result rule 的建议非常有用,我可以解决路径问题,我现在可以构建项目和我的最终目标文件正在生成。现在我只需要看看它会有多好!!!!非常感谢这么快的回复!!!
【解决方案2】:

听起来 Scott Wales 的建议似乎解决了您的问题,但我会添加一些其他内容。

  1. 链接规则不应该在 Makefile3 中,因为 Makefile3 无权在 Algorithm/ 和 exe/ 中生成对象,它应该在主 Makefile 中。
  2. 在 Scott Wales 的帮助下,您解决了 特定 路径问题(我的猜测是“../LOD1/Algorithm”应该是“../Algorithm”),但一般来说,您不应该t 将路径硬编码到这样的目标中。
  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 $@ $^

【讨论】:

  • 亲爱的 Beta,感谢您的回复,我为我的问题获得的支持让我不知所措,stackoverflow 社区真的很活跃,非常有帮助:) 我会考虑您的自动变量建议,我我现在从头开始仔细阅读 gnu make 手册。关于 makefile 的一个最好的部分是它使程序员能够深入了解项目构建过程中发生的事情。编写这些文件可能需要时间,但值得花时间,比在昂贵的 IDE 上花费时间和金钱更值得。
  • 亲爱的 Beta,我在 c 项目的链接过程中遇到问题。我已经将它作为一个新问题提交了,你能建议我如何处理这个问题吗?问题的链接在这里 - “stackoverflow.com/questions/2669082/…
  • @vikramtheone:我想帮忙,但这似乎是汇编语言的问题,我对此几乎一无所知。我只能建议你先尝试一个更简单的问题:自己编译并运行一个汇编程序,然后尝试将它与 HelloWorld.c 链接。
【解决方案3】:

从您的错误输出来看,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,而不是按顺序运行它们。

【讨论】:

  • 嗨,Ivo,我利用了 Scott 关于最后结果规则的建议。它非常有用,我可以修复路径问题,我现在可以构建项目并且我的最终目标文件正在生成。现在我只需要看看它会有多好!!!!非常感谢这么快的回复!!!
猜你喜欢
  • 2012-05-15
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多