最近的項目(so庫)用到rocksdb,之前用的rocksdb是4.3.0,編譯使用很正常。因為要升級,所以將rocksdb升級到5.13.0。
但是經過修改的項目,編譯鏈接后,ldd -r xx.so 總是會出現 undefine symbol: _ZNVTrocksdb6Logger等之類的錯誤。
但是ldd中看出rocksdb.5.13確實鏈接成功了,於是百思不得其解。
在用該庫寫測試用例時,鏈接時會報
xxx.so: undefined reference to `typeinfo for rocksdb::FileLock'
xxx.so: undefined reference to `typeinfo for rocksdb::Logger'
xxx.so: undefined reference to `typeinfo for rocksdb::WritableFile'
xxx.so: undefined reference to `typeinfo for rocksdb::RandomAccessFile'
xxx.so: undefined reference to `typeinfo for rocksdb::EnvWrapper'
xxx.so: undefined reference to `typeinfo for rocksdb::SequentialFile'
於是查找“undefined reference to `typeinfo”,看到http://blog.csdn.net/ai2000ai/article/details/47152133文章。
原來,新版的rocksdb引入了USE_RTTI選項,可以對需函數的typeinfo進行開關,於是加上“USE_RTTI=1”重新編譯rocksdb。
再在自己的項目編譯時也加上-frtti。終於,ldd沒有出現undefine symbol錯誤。
但是,在鏈接測試用例時,還是會出現xxx.so: undefined reference to `typeinfo for rocksdb::FileLock'等錯誤。
於是nm -C xxx.so| grep Logger,還是能看到
U typeinfo for rocksdb::Logger
U vtable for rocksdb::Logger
又郁悶了,苦思冥想中。。。。
經過一番糾結之后,發現是在鏈接測試用例時,鏈接的還是就的rocksdb.so.5.13.0,果斷好了。。。。。
那nm出來的
U typeinfo for rocksdb::Logger
U vtable for rocksdb::Logger
是不是說明是正常的嘞?