为什么编译器会在同一个对象中生成重复的符号?

Tre*_*key 5 c++ symbols g++ nm clang++

请使用以下源代码:

struct Foo {
    Foo(){}
};

Foo f;
Run Code Online (Sandbox Code Playgroud)

使用时clang++,它会为构造函数创建一个符号:

clang++ -c foo.cpp
nm -C foo.o | grep Foo
0000000000000000 W Foo::Foo()
Run Code Online (Sandbox Code Playgroud)

但是,在编译时g++,它会为构造函数创建多个符号:

g++ -c foo.cpp;
nm -C foo.o | grep Foo
0000000000000000 W Foo::Foo()
0000000000000000 W Foo::Foo()
0000000000000000 n Foo::Foo()
Run Code Online (Sandbox Code Playgroud)

为什么会g++在同一个目标文件中创建重复的弱符号?
我唯一的理论是它与内联有关,但这只是猜测.


我应该注意,受损的名称如下所示:

g++ -c foo.cpp; nm foo.o | grep Foo 
0000000000000000 W _ZN3FooC1Ev
0000000000000000 W _ZN3FooC2Ev
0000000000000000 n _ZN3FooC5Ev
Run Code Online (Sandbox Code Playgroud)

因此,尽管未重整名称是相同的,ZN3FooC1Ev并且ZN3FooC2Ev是不同的.