采用以下源代码:
struct Foo {
Foo(){}
};
Foo f;
使用clang++
编译时,它会为构造函数创建一个符号:
clang++ -c foo.cpp
nm -C foo.o | grep Foo
0000000000000000 W Foo::Foo()
但是,当使用g++
编译时,它会为构造函数创建多个符号:
g++ -c foo.cpp;
nm -C foo.o | grep Foo
0000000000000000 W Foo::Foo()
0000000000000000 W Foo::Foo()
0000000000000000 n Foo::Foo()
为什么g++
会在同一个目标文件中创建重复的弱符号?
我唯一的理论是它与内联有关,但这只是猜测。
我应该注意,受损的名字显示如下:
g++ -c foo.cpp; nm foo.o | grep Foo
0000000000000000 W _ZN3FooC1Ev
0000000000000000 W _ZN3FooC2Ev
0000000000000000 n _ZN3FooC5Ev
因此,尽管未拼写的名称相同,但ZN3FooC1Ev
和ZN3FooC2Ev
却不同。