我有一个类定义在一个h文件中,并在一个cpp中实现,这是一个lib的一部分(我们将其称为libdef)。Linux C++编译器(和链接器)如何决定将typeinfo放在哪里?
我有两个其他库有cpp文件,包括这个h文件。其中一个对这个类执行dynamic_cast()(我们称它为libdyn),另一个为这个类做了新的操作(我们称它为libnew)。
看来,在这些库中的一个有所属类别的类型,但不是在其他:
[email protected]> ld --cref libdef.so | grep -E "typeinfo for MyClass"
ld: warning: cannot find entry symbol _start; not setting start address
typeinfo for MyClass libdef.so
[email protected]> ld --cref libnew.so | grep -E "typeinfo for MyClass"
ld: warning: cannot find entry symbol _start; not setting start address
typeinfo for MyClass libdef.so
[email protected]> ld --cref libdyn.so | grep -E "typeinfo for MyClass"
ld: warning: cannot find entry symbol _start; not setting start address
typeinfo for MyClass libdyn.so
正如你可以看到两个libdef和libnew使用来自libdef的所属类别,但libdyn使用它自己所属类别。这是为什么?编译器/链接器如何决定是将typeinfo放入一个库还是从另一个库引用?
我应该注意libnew和libdyn都是用-llibdef构建的。
[email protected]> icpc -V
Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 12.0.0.084 Build 20101006
Copyright (C) 1985-2010 Intel Corporation. All rights reserved.
[email protected]> ld -V
GNU ld version 2.17.50.0.6-14.el5 20061020
Supported emulations:
elf_x86_64
elf_i386
i386linux
经过一些检查后,它取决于lib的cpp文件是否“查看”虚拟方法定义。
此代码将不会导致所属类别库中的元件是:
class SomeClass { public: SomeClass(); virtual void func(); };
此代码将在库中产生一个所属类别符号:
class SomeClass { public: SomeClass() {} virtual void func() {} };
当存在时,所属类别符号将有模糊的联系。
您似乎认为每种类型只有一个typeinfo对象...标准不能保证这一点,它只能保证如果有多个,它们会比较相等。 – 2011-05-23 13:27:30
@Ben问题是,如果有多个,它们在Linux中并不相等(因为使用了地址比较)。如果您只是在gcc告诉您使用库时才会发生这种情况,但我们仍然遇到问题,并且正在尝试为我们的产品寻找一些解决方法。 – selalerer 2011-05-23 17:22:50
通过“比较等于”,我不是说地址比较。我的意思是'operator =',它是为'typeinfo'类型的对象定义的。这是标准保证将用于比较typeinfo实例的唯一机制。 – 2011-05-23 20:32:03