首页 > 解决方案 > makefile上的致命错误,需要了解问题

问题描述

我的 makefile 给出以下错误消息:

ma.c:(.text+0x5aa): multiple definition of `dividetoken'
obj/src/ag.o:ag.c:(.text+0x0): first defined here
obj/src/ma.o: In function `main':
ma.c:(.text+0x629): multiple definition of `main'
obj/src/ag.o:ag.c:(.text+0x6ef): first defined here
obj/src/cv.o: In function `readln':
cv.c:(.text+0xb2): multiple definition of `readln'
obj/src/ag.o:ag.c:(.text+0x7f): first defined here
obj/src/cv.o: In function `dividetoken':
cv.c:(.text+0x176): multiple definition of `dividetoken'
obj/src/ag.o:ag.c:(.text+0x0): first defined here
obj/src/cv.o: In function `main':
cv.c:(.text+0x1f5): multiple definition of `main'
obj/src/ag.o:ag.c:(.text+0x6ef): first defined here
obj/src/sv.o: In function `readln':
sv.c:(.text+0x0): multiple definition of `readln'
obj/src/ag.o:ag.c:(.text+0x7f): first defined here
obj/src/sv.o: In function `dividetoken':
sv.c:(.text+0x150): multiple definition of `dividetoken'
obj/src/ag.o:ag.c:(.text+0x0): first defined here
obj/src/sv.o: In function `main':
sv.c:(.text+0xcb5): multiple definition of `main'
obj/src/ag.o:ag.c:(.text+0x6ef): first defined here
collect2: error: ld returned 1 exit status
makefile:17: recipe for target 'program' failed
make: *** [program] Error 1

我应该怎么办 ?能轻松解决吗?我不知道该怎么办

我的生成文件如下所示:

ODIR = obj
IDIR = include
SDIR = src

CC = gcc
EXE = program

DEPS = $(IDIR)/$(wildcard*.h)
SOURCES = $(wildcard $(SDIR)/*.c)

OBJECTS = $(foreach o, $(patsubst %.c,%.o,$(SOURCES)), $(ODIR)/$o)

$(ODIR)/%.o : %.c $(DEPS)
    $(CC) -c -o $@ $< 

$(EXE): $(OBJECTS)
    $(CC) $(OBJECTS) -o $(EXE)

clean:
    rm $(ODIR)/$(SDIR)/*
    rm $(EXE)

我希望这可以帮助了解我的错误是什么。

标签: cmakefile

解决方案


您的 Makefile 看起来不错 - 我看不出它有任何问题 [*]。问题是您正在编译的代码。

看看您遇到的错误之一:

obj/src/sv.o:在函数“main”中:

sv.c:(.text+0xcb5): 'main' 的多重定义

obj/src/ag.o:ag.c:(.text+0x6ef): 首先定义在这里

也就是说,您有一个名为“sv.c”的文件,其中有一个函数调用main。并且您有另一个名为“ag.c”的文件,其中也有一个调用函数main。您正在尝试将这两个文件编译到同一个程序中,但您只能拥有一个名为main.

[*] 猜测一下,您的“src”目录中似乎有多个程序,而您的 Makefile 正试图将所有内容构建成一个巨大的程序。如果是这种情况,您需要将代码分隔到它们自己的目录中或更改您的 Makefile 以便SOURCES仅列出与您正在编译的程序相关的源文件。

如果你想在同一个 Makefile 中编译多个程序,你需要将它们分开。每个程序都需要自己的构建规则来指定它需要的依赖项。您可以OBJECTS以相同的方式为它们中的每一个生成变量 - 但您需要列出每个程序所需的 C 文件。

SOURCES1 = ag.c other.c something.c
SOURCES2 = sv.c morecode.c something.c

OBJECTS1 = $(foreach o, $(patsubst %.c,%.o,$(SOURCES1)), $(ODIR)/$o)
OBJECTS2 = $(foreach o, $(patsubst %.c,%.o,$(SOURCES2)), $(ODIR)/$o)

$(ODIR)/%.o : %.c $(DEPS)
    $(CC) -c -o $@ $< 

program1: $(OBJECTS1)
    $(CC) $^ -o $@

program2: $(OBJECTS2)
    $(CC) $^ -o $@

供参考$^表示所有依赖项。


推荐阅读