为啥编译时出现多个定义错误?

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

以上是关于为啥编译时出现多个定义错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在反编译我的应用程序时出现错误?

编译 streamlit 程序时出现多个错误

为啥编译时出现cannot find lz错误,怎么解决

为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]

为啥编译时出现cannot find lz错误,怎么解决

为啥在 Visual Studio 中编译 C++ 项目时出现致命错误“LNK1104:无法打开文件 'cryptlib.lib'?