一下为源代码main.cpp fun.cpp 均放在同一个目录下.请参考头文件多重定义一起看.
<main.cpp>
#include <stdio.h>
#include <stdlib.h>
extern int a;
int main()
{
printf("%d \n",a);
return 0;
}
<fun.cpp>
#include <stdio.h>
int a=10;
void fun2()
{
printf("a2:%d \n",a);
}
这个程序相对于能正常的执行.我们同样从符号表来探究.
main.o: 文件格式 elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 main.cpp
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 l d .bss 0000000000000000 .bss
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack
0000000000000000 l d .eh_frame 0000000000000000 .eh_frame
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 g F .text 0000000000000024 main
0000000000000000 *UND* 0000000000000000 a
0000000000000000 *UND* 0000000000000000 _GLOBAL_OFFSET_TABLE_
0000000000000000 *UND* 0000000000000000 printf
fun.o: 文件格式 elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 fun.cpp
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 l d .bss 0000000000000000 .bss
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack
0000000000000000 l d .eh_frame 0000000000000000 .eh_frame
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 g O .data 0000000000000004 a
0000000000000000 g F .text 0000000000000020 _Z4fun2v
关键:请看两个符号表中对变量a的描述"main.o"里面a时未定义的,在"fun.o"里面时一个已经分配的静态/全局数据区 的变量,相对于改程序保证了 全局变量a的唯一性.
但是如果,某种原因在 链接*.o文件生成可执行文件的时候,没有找到main.o中未定义的变量a,那么就是变量未定义的错误.