在编译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
, #ifndef
PR_NSEC_SZ
和#endif
macros保护。
在编译方面,我只需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文件中,并在所有其他文件中出现。