Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么编译器会在同一个对象中生成重复的符号?_C++_G++_Symbols_Clang++_Nm - Fatal编程技术网

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
可能重复的问题之间的区别