如何解决多定义编译器错误

时间:2015-06-08 00:24:15

标签: android c makefile arm jtag

我收到以下错误消息,我检查了文件,但无法弄清楚为什么或如何解决错误。请帮忙。

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

我在this link

处放了一份jtag-mm.c

感谢。这是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,你可以验证我认为的问题。正如Peter所说,变量被声明两次。一次通过jtag.c再次通过jtag-mm.c。例如,我看到了这些行:

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

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

Here是jtag.h的副本 感谢

1 个答案:

答案 0 :(得分:0)

您尚未显示jtag.h文件,因此只能推测它正在做什么。

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

的头文件中
 #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

您也可以(在修复上述内容之后,编译器停止对您的代码进行阻塞)获取链接器错误。这将来自多个源文件#include您的标头 - 因此链接器会看到多个目标文件中定义的符号。该解决方案的解决方案是将头文件中的违规定义(通常是函数或静态变量)移动到项目中的一个(并且只有一个)源文件。

相关问题