为啥编译时出现多个定义错误?
Posted
技术标签:
【中文标题】为啥编译时出现多个定义错误?【英文标题】:Why am I getting Multiple definition errors while compiling?为什么编译时出现多个定义错误? 【发布时间】:2021-07-08 18:21:25 【问题描述】:我正在尝试在 Contiki 中编写一个简单的程序来生成两个数字之间的随机数,然后在 Zolertia 模块上将其闪烁。
我的代码是:
#include <stdio.h>
#include <stdlib.h>
#include "contiki.h"
#include <sys/node-id.h>
PROCESS(test_randnum, "Random Number");
AUTOSTART_PROCESSES(&test_randnum);
static struct etimer et;
PROCESS_THREAD(test_randnum, ev, data)
PROCESS_BEGIN();
int16_t r;
//random_init(node_id);
//unsigned short r = random_arnd();
while(1)
etimer_set(&et, CLOCK_SECOND);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
r = rand() % (40 - 20) + 20;
printf("Number: %d\n", r);
etimer_reset(&et);
PROCESS_END();
但是,在尝试编译文件时,出现以下“多重定义”错误:
user@iot-workshop:~/Desktop/Projeto$ make
using saved target 'zoul'
CC test_randnum.c
CC ../../contiki//cpu/cc2538/./ieee-addr.c
CC ../../contiki//cpu/cc2538/cc2538.lds
CC ../../contiki//cpu/cc2538/./startup-gcc.c
CC test_randnum.c
LD test_randnum.elf
test_randnum.co:(.data.test_randnum+0x0): multiple definition of `test_randnum'
obj_zoul/test_randnum.o:(.data.test_randnum+0x0): first defined here
collect2: error: ld returned 1 exit status
../../contiki//cpu/cc2538/Makefile.cc2538:100: recipe for target 'test_randnum.elf' failed
make: *** [test_randnum.elf] Error 1
rm obj_zoul/startup-gcc.o test_randnum.co
这是我的 Makefile:
DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
CONTIKI_PROJECT = test_randnum
CONTIKI_TARGET_SOURCEFILES += test_randnum.c
all: $(CONTIKI_PROJECT)
CONTIKI = ../../contiki/
include $(CONTIKI)/Makefile.include
已经尝试寻找解决方案但没有得到任何结果,这是我第一次出现此错误。 有谁知道如何解决这个问题?
谢谢!
【问题讨论】:
问:你给我们看的“代码”是什么源文件? “test_randnum.c”,还是“别的东西”?问:为什么不在使用之前声明test_randnum
(函数?变量?)?问:为什么“CC test_randnum.c”在你的“make”输出中出现两次?是否有两个不同的文件(或者确实 THINK 有两个不同的文件)?一个完整的示例 (sscce.org) 会有所帮助...
@paulsm4 是的,源文件的名称是“test_randum.c”。为什么我应该将test_randum
声明为函数或变量?我已经用我的 Makefile 编辑了这个问题。
对于“普通的 C 程序”,您通常应该声明每个变量和函数。 Contiki 宏似乎可以为您执行此操作。另外:你的代码 + makefile 是一个完全足够的sscce.org。谢谢你。结论:问题是“ld”链接错误;根本原因可能在您的 Makefile 中。建议:1)尝试注释掉#CONTIKI_TARGET_SOURCEFILES += ...
,2)检查您是否以某种方式在构建文件夹中的任何位置获得多个“test_randnum.o”文件,3)尝试从构建中消除双CC test_randnum.c
输出行。
@paulsm4 非常感谢!!退出#CONTIKI_TARGET_SOURCEFILES += ...
让它成功了!最后!这对我来说是第一次,我总是在 Makefile 中使用该指令,这是我第一次遇到问题。您知道为什么会导致此错误吗?
【参考方案1】:
这是链接器“ld”错误。我们可以看到make命令的输出包含两次'CC test_randnum.c',这是不寻常的。如果不查看您的 makefile 来提出一些修复建议,就很难说。
【讨论】:
我编辑了问题并添加了我的 Makefile以上是关于为啥编译时出现多个定义错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]
为啥在 Visual Studio 中编译 C++ 项目时出现致命错误“LNK1104:无法打开文件 'cryptlib.lib'?