如何通过gcc临时文件创build进行疑难解答

在编译C(而不是C ++)代码的时候,我在链接期间出错了,某些标识符已经在多个地方被定义了,但是如下所示,输出是非常神秘的。

有没有办法从gcc获得更好的消息,以便我可以看到哪些文件是多重定义的原因?

/tmp/cc8kgsLE.o:(.rodata+0x0): multiple definition of `PR_SZ' /tmp/ccDfv6U4.o:(.rodata+0x0): first defined here /tmp/cc8kgsLE.o:(.rodata+0x8): multiple definition of `PR_SEC_SZ' /tmp/ccDfv6U4.o:(.rodata+0x8): first defined here /tmp/cc8kgsLE.o:(.rodata+0x10): multiple definition of `PR_NSEC_SZ' /tmp/ccDfv6U4.o:(.rodata+0x10): first defined here collect2: ld returned 1 exit status 

更新:根据回应,我进一步澄清PR_SZPR_SEC_SZPR_NSEC_SZ在一个.h文件中定义,它受#ifndef#ifndef PR_NSEC_SZ#endifmacros保护。

在编译方面,我只需input:

 gcc -Wall -I. -file1.c file2.c -o file2 

更新:

除了回应,我发现下面的链接相关的全局常量,而不使用#define

显示的输出对我来说看起来并不神秘,这是非常清楚的…全局变量(这是不好的) PR_SZ, PR_SEC_SZ, PR_NSEC_SZ被定义为多个.c文件

你如何编译你的项目?

这里的主要问题是.o文件名与.c文件的文件名不匹配。 所以为了能够看到一个更好的信息,你应该改进你的Makefile或者你正在用来构建你的项目的东西。

有关信息:

  • .h中,全局变量声明的原型必须以关键字: extern为前缀
  • 只有一个.c文件中的变量应该正常申报

你可以这样做。

在头文件中

 /* ah */ MYEXTERN int PR_SZ; /* or whatever your variable data type is */ 

在第一个.c文件中

 /* ac */ /* MYEXTERN doesn't evaluate to anything, so var gets defined here */ #define MYEXTERN #include "ah" 

在其他.c文件中

 /* MYEXTERN evaluates to extern, so var gets externed in all other C files */ #define MYEXTERN extern #include "ah" 

所以它只被定义在一个.c文件中,并在所有其他文件中出现。