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是不同的.