想请教一个关于 link 的问题

正常输出 1000

报错
/usr/bin/ld: /tmp/ccnihdJU.o:(.data+0x0): multiple definition of `a’; /tmp/cc8sytkl.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

两次编译命令都是
g++ main.cpp test.cpp -o mytest.o

第二张图改用
g++ test.cpp -c test.o
g++ main.cpp -c main.o
g++ main.o test.o -o mytest.o

还是
/usr/bin/ld: test.o:(.data+0x0): multiple definition of `a’; main.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

想问问第二张图 main.cpp 的 a 为什么不是弱变量 local var 应该绑定到 test.cpp 的 a 上,是我什么地方理解错了吗

把所有的源文件都改成.c 就能正确链接了。

问题的根源是 C++ 编译器一般不会生成 common symbol(就算使用 -fcommon)。但是 C 会,因为它要支持从 Fortran port 来的程序,而 common symbol 是 Fortran 的首创。

对这个问题可以详见:C++ compiler - common symbols - Stack Overflow

你也可以使用readelf -s观察符号的 index 是否为 COM,从而确定编译器是否生成了一个 common symbol。