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

标签 c gcc makefile linker

我是 Makefile 编写领域的新手。我有一个 C 项目,我想使用 GCC 构建,我可以编写一个非常好的 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

最佳答案

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

关于c - GCC 链接时间错误 - 没有规则可以制定目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2653066/

相关文章:

c++ - 分配顺序产生不同的装配

Ubuntu 11.10 上的 c 数学链接器问题

内核模块(Linux)中编写的中断可以通知Qt中正在运行的程序吗?没有用户空间程序等待/轮询?

c - C switch 语句中的最终子句(可能使用 goto)

linux - 链接器在传递给它的目标文件上删除字符?

c - 为什么我的非常简单的 makefile 不起作用

c - 使用ffmpeg安装Open-CV出错

Makefile 示例和/或模板

mysql - c程序添加一个用户到mysql

c - 在 C 中,如何从字符串中取出两个字符,并将它们分配为自己的字符串?