在编译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
更新:
除了回复,我发现以下链接相关 global constants without using #define
答案 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文件中定义。在所有其他人中被淹没。