我正在研究需要兩個第三方庫(libfoo.so和libbar.so)的C++項目。我的操作系統是Linux。具有不兼容依賴關係的鏈接庫
libfoo.so動態鏈接到libpng14.so.14(1.4.8)(EDIT 1)
libbar.so似乎靜態鏈接到
的libpng的unknwon版本
的libpng 1.2.8 (EDIT 1)
我說 「似乎」,是因爲:
ldd libbar.so
沒什麼不顯示,有關PNGnm -D libbar.so | grep png_read_png
說: 「004f41b0牛逼png_read_png」less libbar.so | grep png_read_png
說: 「4577:004f41b0 738 FUNC全局默認10 png_read_png」
當我開始我的程序,它放棄:
terminate called after throwing an instance of 'char const*'
這是GDB回溯:
#0 0xb7ffd424 in __kernel_vsyscall()
#1 0xb5e776a1 in raise() from /lib/libc.so.6
#2 0xb5e78de2 in abort() from /lib/libc.so.6
#3 0xb60a997f in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libstdc++.so.6
#4 0xb60a78a5 in ??() from /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libstdc++.so.6
#5 0xb60a78e2 in std::terminate()() from /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libstdc++.so.6
#6 0xb60a7a21 in __cxa_throw() from /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libstdc++.so.6
#7 0xb5abf76d in ??() from /usr/lib/libfreeimage.so.3
#8 0xb6fb9346 in png_error() from lib/libfsdk.so
#9 0xb6fa2a59 in png_create_read_struct_2() from lib/libfsdk.so
#10 0xb6fa2b7a in png_create_read_struct() from lib/libfsdk.so
#11 0xb5abfa44 in ??() from /usr/lib/libfoo.so
#12 0xb5aa766b in FreeImage_LoadFromHandle() from /usr/lib/libfreeimage.so.3
#13 0xb5aa59f6 in FreeImage_LoadFromMemory() from /usr/lib/libfreeimage.so.3
#14 0xb68a94a5 in Foo::Image::load (this=0xb4eff560, input=...)
正如你所看到的,異常拋出美孚::圖像::負載屬於libfoo.so的
禁用我的代碼使用libbar.so部分和刪除鏈接到它, Foo :: Image :: load不會拋出任何異常並且正常工作。
所以我想這可能是由於符號表中的一些不明確之處。我該如何解決它?
編輯1個
png_access_version_number()
- 隨着libbar.so鏈接,
png_access_version_number()
回報10208
:版本1.2.8 - 沒有libbar.so鏈接,
png_access_version_number()
回報10408
:版本1.4.8
您必須使用`nm -D`來查看共享庫的dynsyms。只有`nm`適用於調試符號,在大多數發行版中都會被剝離。 – 2011-12-16 14:22:01
@jørgensen,謝謝! – 2011-12-16 14:28:10