Mac OS X将.so文件链接到动态库

时间:2016-08-11 20:26:08

标签: python c++ macos boost

我正在尝试构建一个依赖于几个库的python包,包括boost,boost-python和fftw。我能够编译包没有任何错误,但是当我尝试使用steme --help命令运行程序时,我收到一个错误:

2016-08-11 15:07:55,571:ERROR: ImportError: dlopen(/Users/<>/.ENV/lib/python2.7/site-packages/STEME-1.9.1-py2.7-macosx-10.11-intel.egg/stempy/_release_build/_index.so, 2): Symbol not found: __ZN5boost6python6detail13current_scopeE
  Referenced from: /Users/<>/.ENV/lib/python2.7/site-packages/STEME-1.9.1-py2.7-macosx-10.11-intel.egg/stempy/_release_build/_index.so
  Expected in: flat namespace
 in /Users/<>/.ENV/lib/python2.7/site-packages/STEME-1.9.1-py2.7-macosx-10.11-intel.egg/stempy/_release_build/_index.so

我的理解是文件_index.so正在寻找符号__ZN5boost6python6detail13current_scopeE但无法找到它。接下来,我使用_index.so检查了哪些库链接到otool -L文件:

/Users/<>/.ENV/lib/python2.7/site-packages/STEME-1.9.1-py2.7-macosx-10.11-intel.egg/stempy/_release_build/_index.so:
    /usr/local/opt/fftw/lib/libfftw3.3.dylib (compatibility version 8.0.0, current version 8.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

基于此,我认为正在发生的是boost-python动态库在编译期间未正确链接到_index.so。要检查我是否在nm -g dylib上运行了boost-python(使用brew安装了它们,以及其他提到的依赖项)。在libboost_python.dylib文件中找到了缺少的符号:

0000000000031d08 S __ZN5boost6python6detail13current_scopeE

那么,我的下一个问题是,如何将libboost_python.dylib文件(位于/usr/local/Cellar/boost-python/1.61.0/lib)与_index.so文件相关联?这会解决问题吗?是否需要设置一些编译器标志以确保构建正确链接?

1 个答案:

答案 0 :(得分:0)

尝试在启动二进制文件时在您的路径中包含/usr/local/Cellar/boost-python/1.61.0/lib。像

这样的东西
$ export PATH=$PATH:/usr/local/Cellar/boost-python/1.61.0/lib
$ ./your-binary

图书馆的链接就在那里,否则您无法通过otool找到它。我认为该程序没有找到共享库,因为它无法在PATH中找到。

此错误似乎非常类似于未找到的&#34; DDL&#34; Windows中的错误类型,可以通过在当前目录或PATH中提供DDL来修复。