来自libc ++的符号在运行时在错误的库中搜索

时间:2013-09-24 10:22:35

标签: c++ macos dynamic-linking

我有一个应用程序链接到我们自己的库并提升date_time,都使用libc ++(带有clang)。

运行应用程序时,它会立即停止在boost库中查找__ZTISt12out_of_range(=“typeinfo for std :: out_of_range”)。

bash-3.2$ ./communicator 
dyld: Symbol not found: __ZTISt12out_of_range
  Referenced from: (...)/../Frameworks/libsipclient.dylib
  Expected in: (...)/../Frameworks/libboost_date_time-mt.dylib
 in (...)/../Frameworks/libsipclient.dylib
Trace/BPT trap: 5

他们都将它作为未定义的符号,并且/usr/libc++.1.dylib具有它:

bash-3.2$ nm -u ../Frameworks/{libsipclient,libboost_date_time-mt}.dylib | grep __ZTISt12out_of_range
__ZTISt12out_of_range
__ZTISt12out_of_range
bash-3.2$ nm /usr/lib/libc++.1.dylib | grep __ZTISt12out_of_range
000000000006d5c0 S __ZTISt12out_of_range

两者都根据otool使用libc ++和正确的路径:

bash-3.2$ otool -L ../Frameworks/libsipclient.dylib | grep -e libboost -e libc
        @executable_path/../Frameworks/libboost_date_time-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 65.1.0)
bash-3.2$ otool -L ../Frameworks/libboost_date_time-mt.dylib 
../Frameworks/libboost_date_time-mt.dylib:
        @executable_path/../Frameworks/libboost_date_time-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 65.1.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

libsipclient.dylib最初链接到boost :: date_time,它连接到libstdc ++而不是libc ++(链接器参数的路径早于libc ++)。