【问题标题】:How to address multiple definition compiler error如何解决多定义编译器错误
【发布时间】:2015-06-08 00:24:14
【问题描述】:

我收到以下错误消息,我检查了文件但不知道为什么或如何解决这些错误。请帮忙。

arch/arm/mach-msm/jtag-mm.o: In function `dbg_init_arch_data':
/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag-mm.c:279: multiple definition of `msm_jtag_save_cntr'
arch/arm/mach-msm/jtag.o:/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag.c:1085: first defined here
arch/arm/mach-msm/jtag-mm.o: In function `etm_init_arch_data':
/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag-mm.c:568: multiple definition of `msm_jtag_save_state'
arch/arm/mach-msm/jtag.o:/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag.c:1038: first defined here
arch/arm/mach-msm/jtag-mm.o: In function `msm_jtag_restore_state':
/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag-mm.c:585: multiple definition of `msm_jtag_restore_state'
arch/arm/mach-msm/jtag.o:/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag.c:1073: first defined here
arch/arm/mach-msm/jtag-mm.o: In function `dbg_init_arch_data':
/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag-mm.c:279: multiple definition of `msm_jtag_restore_cntr'
arch/arm/mach-msm/jtag.o:/home/sansari/WORKING_DIRECTORY/arch/arm/mach-msm/jtag.c:1085: first defined here
make[1]: *** [arch/arm/mach-msm/built-in.o] Error 1

我将 jtag-mm.c 的副本放在this link

谢谢。这里是jtag.c

注释掉 jtag.h 并重新编译后,我收到以下错误消息:

arch/arm/mach-msm/jtag-mm.c:790:2: error: implicit declaration of function 'msm_jtag_fuse_apps_access_disabled' [-Werror=implicit-function-declaration]
cc1: some warnings being treated as errors
make[1]: *** [arch/arm/mach-msm/jtag-mm.o] Error 1
make: *** [arch/arm/mach-msm] Error 2

@Peter - 谢谢。我明白你在说什么。行。让我试试。没关系 grep 评论:-) 我认为这是不可能的。

更新:谢谢。我可以看到现在是什么问题。现在我已经发布了 jtag.h、jtag-mm.c 和 jtag.c,您或许可以验证我认为的问题所在。正如彼得所提到的,变量被声明了两次。一次是 jtag.c,一次是 jtag-mm.c。例如,我看到以下行:

uint32_t msm_jtag_save_cntr[NR_CPUS];
uint32_t msm_jtag_restore_cntr[NR_CPUS];

在两个文件中。但是我试图在一个文件中将它们注释掉,但由于该变量在函数的同一文件中使用,因此出现错误。那么处理这个问题的正确方法是什么?我可以在头文件中声明一次,然后从两个源文件中删除它吗?还是应该将减速保留在一个源文件中,并将其包含在另一个源文件中?

Here 是 jtag.h 的副本 谢谢

【问题讨论】:

  • 我们还需要查看jtag.c的内容。但是,这两个 .c 文件似乎都包含 4 个在两个文件中具有相同名称的函数。
  • 1) 大多数/所有函数都声明为“静态”,然后使用“EXPORT_SYMBOL”导出一些函数名称。一般来说,让“静态”函数全局可见并不是一个好主意。 2)许多函数都有'inline'修饰符,但是,函数非常大。因此,编译器不会“内联”它们。如果从多个位置调用这些函数,那么从删除调用/返回序列中节省的微不足道的费用将被淹没。 3)内联函数应该在头文件中,所以多个源可以内联它们
  • 在文件中,“内联”函数(我没有全部检查)仅被调用一次并且函数很大。所以:1)函数不会被“内联”2)内联仅适用于多次调用的非常短的函数
  • 具有重复定义的 4 个函数中的 2 个在 jtag-mm.c 文件中。似乎所有 4 个重复函数都在 jtag.c 文件中定义/导出。强烈建议对函数使用唯一名称,也许从 jtag_mm.c 文件中删除 '#include ' 行会有所帮助。

标签: android c makefile arm jtag


【解决方案1】:

您还没有显示 jtag.h 文件,因此只能推测它在做什么。

由于大多数错误在“注释掉 jtag.h”时消失,最可能的解释是头文件有定义,而源文件之一是 #includeing 该头文件不止一次(直接或者 - 更有可能 - 间接地,由于其他头文件 #includeing 它)。一个常见的解决方案是在表单的头文件中添加包含保护

 #ifndef SOME_MACRO_CHOSEN_TO_BE_UNIQUE_TO_THE_HEADER
 #define SOME_MACRO_CHOSEN_TO_BE_UNIQUE_TO_THE_HEADER

   /*  the content of the header file

 #endif

您也可能(在修复上述问题后,因此编译器停止阻塞您的代码)出现链接器错误。这将由多个源文件#includeing 您的标头导致 - 因此链接器会看到多个目标文件中定义的符号。解决这个问题的方法是将有问题的定义(通常是函数或静态变量)从头文件移动到项目中的一个(并且只有一个)源文件。

【讨论】:

  • 我尝试从其中一个源文件中删除有问题的声明。但我收到错误:'msm_jtag_save_cntr' 未声明。我该如何解决?我可以将声明放在头文件中吗?
  • 如果您对源文件之间共享的变量感到满意,则在标题中声明它extern(即extern uint32_t msm_jtag_save_cntr[NR_CPUS];),然后在 ONE 中定义它,并且只在其中的 ONE 中定义它源文件(即uint32_t msm_jtag_save_cntr[NR_CPUS];)。请记住,在任何源文件中对该变量/数组所做的更改将对另一个源文件中的代码可见。不过,这只是权宜之计-您真正的问题是在源文件之间复制代码而不了解其含义(有几种方法会遇到麻烦)。
  • 谢谢。我现在只是在追求功能。我相信在源文件之间复制代码的问题有安全隐患吗?我现在不关心这个,因为这将是一个原型图像。
  • 我指的不是安全隐患。我指的是一个源文件中的代码对另一个源文件中使用的变量做意外的事情所带来的基本问题。在源文件之间复制代码肯定会引入维护问题 - 正如您所演示的那样。
  • 你不知道我是多么欣赏这一点。我不仅解决了我的问题,还了解了更改配置的含义。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
相关资源
最近更新 更多