1

在编译 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_SZ, PR_SEC_SZ,PR_NSEC_SZ是在一个文件中定义的.h, 该文件受#ifndef,#define#endif宏保护..

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

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

更新:

除了响应之外,我发现以下链接相关的 全局常量没有使用#define

4

2 回答 2

4

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

你如何编译你的项目?

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

有关信息:

  • .h全局变量声明的原型中,必须以关键字为前缀:extern
  • 仅在一个.c文件中正常声明变量
于 2012-12-17T17:32:26.753 回答
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 文件中定义,并在所有其他文件中被外部化。

于 2012-12-17T17:57:44.450 回答