c - 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)
我希望这可以帮助了解我的错误是什么。
解决方案
您的 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 $@
供参考$^
表示所有依赖项。
推荐阅读
- java - 每次我开始一个新项目时,我是否必须在 Android Studio 中同步 gradle 项目?
- php - 使用 php 链接到另一个 html 页面时访问被拒绝
- symfony - Jenkins - 带有环境变量的 Symfony
- apache - 使用apache mod_wsgi测试报错---windows环境
- python - 绘制 X 轴边距
- javascript - 有没有办法从 ejs 获取内容到 node-js 服务器?
- authentication - Not able to access WSO2 IoTS Device Management Console in wso2-iot-3.3.0 when logged in 'admin'
- php - Commas not found in file with php
- python - 为什么 Python 包在 IDLE 3.7 中运行而不在 Atom 中运行?
- java - 服务器在套接字中关闭后,我可以与同一个客户端建立自动先前连接吗