如何通过gcc临时文件创建进行故障排除

时间:2012-12-17 17:15:46

标签: c linux gcc

在编译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#define#endif宏保护..

在编译方面,我只需输入:

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

更新:

除了回复,我发现以下链接相关 global constants without using #define

2 个答案:

答案 0 :(得分:4)

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

如何编译项目?

这是主要问题,.o文件名与.c文件的文件名不匹配。 因此,为了能够看到更好的消息,您应该改进Makefile或用于构建项目的任何内容。

有关信息:

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

答案 1 :(得分:2)

你可以这样做。

在头文件中

/* a.h */
MYEXTERN int PR_SZ; /* or whatever your variable data type is */

在第一个.c文件中

/* a.c */
/* MYEXTERN doesn't evaluate to anything, so var gets defined here */
#define MYEXTERN 
#include "a.h"

在其他.c文件中

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

因此它仅在一个.c文件中定义。在所有其他人中被淹没。