假设一个简单的文件bla.cpp
:
struct MyClass {
virtual int foo(int x);
virtual ~MyClass();
};
int MyClass::foo(int x) { return x + 23; }
MyClass::~MyClass() {}
使用
构建共享库g++ -c -fPIC bla.cpp
g++ -shared -o bla.so bla.o
通常包含一些type_info
符号,因为默认情况下在gcc上启用了RTTI。但是,如果我用
g++ -c -fPIC -fno-rtti bla.cpp
type_info
将丢失。
是否有一种简单,可靠的方法(在gcc
或clang
上)检查是否已使用-fno-rtti
或-frtti
构建了库?我问,因为今天我盯着臭名昭着的undefined reference to type_info
,我花了一点时间才明白,这是由于我正在链接而不是用-fno-rtti
构建的库。
答案 0 :(得分:5)
如果一个班级有虚拟。函数,它应该有类型信息。执行nm -C libname.so
并注意“vtable for”,“typeinfo for”和“typeinfo name for”。例如:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$_ZTI3Foo
00000000 r .rdata$_ZTS3Foo
00000000 r .rdata$_ZTV3Foo
00000000 r .rdata$zzz
00000000 t .text
00000000 T Foo::foo()
00000000 R typeinfo for Foo
00000000 R typeinfo name for Foo
00000000 R vtable for Foo
U vtable for __cxxabiv1::__class_type_info
如果您有vtable
但不是typeinfo
,则会使用-fno-rtti
进行编译。例如:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$_ZTV3Foo
00000000 r .rdata$zzz
00000000 t .text
00000000 T Foo::foo()
00000000 R vtable for Foo
如果您没有任何虚拟功能,则无法分辨(也不应该关注)。
答案 1 :(得分:3)
如果你需要这个来进行配置,那就像GNU autoconf一样:编写一个最小的proggie进行检查并构建那个。构建(或者可能是运行)是否失败告诉您需要知道什么。