C++ 为什么编译器会在同一个对象中生成重复的符号?
以以下源代码为例:C++ 为什么编译器会在同一个对象中生成重复的符号?,c++,g++,symbols,clang++,nm,C++,G++,Symbols,Clang++,Nm,以以下源代码为例: 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() 0000
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
是不同的。如果您要求g++
使用g++-O-c
进行优化,它只会发出一个符号。另外,当您查看汇编代码(g++-fverbose asm-S
)时,您会得到两个不同的弱符号\u ZN3FooC1Ev
和\u ZN3FooC2Ev
,它们的需求方式与Foo::Foo()相同
@BasileStarynkevitch这是一个通往全新兔子洞的入口。你应该编辑你的问题,并询问\u ZN3FooC1Ev
和\u ZN3FooC2Ev
可能重复的问题之间的区别