【问题标题】:libboost_python3 missing dynamic link to Python?libboost_python3 缺少到 Python 的动态链接?
【发布时间】:2019-07-13 04:35:50
【问题描述】:

我几天来一直在努力让image_proc 支持 ROS2 的运行。它链接到vision_opencv,后者又链接到libboost_python3

现在尝试运行这个我很熟悉:

dyld: Symbol not found: _PyBaseObject_Type
  Referenced from: /usr/local/opt/boost-python3/lib/libboost_python37.dylib
  Expected in: flat namespace
 in /usr/local/opt/boost-python3/lib/libboost_python37.dylib

使用nm 工具进行进一步调查:

nm -u /usr/local/opt/boost-python3/lib/libboost_python37.dylib | grep _PyBaseObject_Type

_PyBaseObject_Type

_PyBaseObject_Type 在 libboost_python37 中确实未定义。

我们来看看libboost_python37链接了哪些库:

otool -L /usr/local/opt/boost-python3/lib/libboost_python37.dylib

usr/local/opt/boost-python3/lib/libboost_python37.dylib:
    /usr/local/opt/boost-python3/lib/libboost_python37.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)

它缺少任何指向 Python 的动态链接,这导致我提出我的第一个问题:

  • python 是否应该链接到 libboost_python37

我在网上的其他地方看到过,一个老问题,有人从otool -L 发布了他们的输出,其中包含它(虽然它是针对 -mt 文件的,但我的 mt 也没有。)

otool -L libboost_python-mt.dylib
libboost_python-mt.dylib:
    /opt/local/lib/libboost_python-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

(他们的输出)

我的第二个问题:

  • 有谁知道问题出在哪里或如何解决?

由于我使用的是 ROS2 构建工具 colcon 而不仅仅是直接编译,因此事情变得有点复杂。

一些附加信息: 有人建议通过将 libboost_python37.dylib 链接到 libboost_python3.dylib 来解决此错误,因为它无法被拾取。这不是问题,也没有解决。

我还安装了 Brew 的 boost 和 boost-python3,并自己编译,这两个地方都一样。 Python 命令是最新的 python 3.7.3,它是“默认”,如 python --version 给出 3.7.3。

【问题讨论】:

    标签: python c++ boost cmake ros2


    【解决方案1】:

    第一个问题:

    python 应该链接到 libboost_python37 吗?

    似乎没有必要,如https://www.mail-archive.com/distutils-sig@python.org/msg23796.htmlhttps://github.com/Cantera/cantera/issues/319 所示。

    有些库是链接的,有些则没有。

    有谁知道问题是什么或如何解决?

    我找到了一个我根本不喜欢的解决方法,因为我仍然不知道根本原因是什么。

    将您的 Python3 库添加到 DYLD_INSERT_LIBRARIES 环境变量使其工作:

    export DYLD_INSERT_LIBRARIES=/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/Python
    

    警告:这使 Virtualenv/pipenv 停止工作。

    这确认它已丢失,并且从 Brew 安装时 Mojave 无法拾取它。希望其他人确认这是 Brew/Mojave/Boost 或 image_proc ROS2 CMakeLists.txt 的问题。

    归功于这个答案:https://stackoverflow.com/a/1990844/1829511

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 2019-07-24
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      相关资源
      最近更新 更多