【问题标题】:MacOS, c++ python extension cannot find a dynamic libraryMacOS、c++ python扩展找不到动态库
【发布时间】:2020-12-18 03:43:06
【问题描述】:

我正在构建一个 c++ python 扩展。到目前为止,我为 Linux 和 Windows 创建了版本。目前,我正在为 MacOS 版本而苦苦挣扎。 CMake 生成 2 个库:

  43898860 Aug 29 13:40 libslide_io.dylib
    214876 Aug 29 13:40 slideio.cpython-35m-darwin.so

我将它们打包到一个 whl 文件中。使用 pip 安装后,当我尝试导入包时,出现以下错误:

(sld-35)dist % python -c "import slideio"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: dlopen(/Users/.../opt/anaconda3/envs/sld-35/lib/python3.5/site-packages/slideio.cpython-35m-darwin.so, 2): Library not loaded: libslide_io.dylib
  Referenced from: /Users/.../opt/anaconda3/envs/sld-35/lib/python3.5/site-packages/slideio.cpython-35m-darwin.so
  Reason: image not found

两个库都正确放置到python环境目录下:

/Users/.../opt/anaconda3/envs/sld-35/lib/python3.5/site-packages/

此外,如果我解压缩 whl 文件并从当前目录导入包,它可以工作。

我怀疑它与我的 cmake 文件中的 rpath 设置有关,但找不到正确的解决方案。我所有的尝试都失败了。

我将不胜感激。

【问题讨论】:

    标签: python c++ macos cmake


    【解决方案1】:

    如果有人感兴趣。我通过执行 install_name 实用程序和 @loader_path 参数添加后期构建解决了这个问题。该命令指示系统在加载程序(在我的情况下为 python 包)文件夹中查找库。

    if (APPLE)
       add_custom_command(TARGET ${BINDLIB_NAME}
               POST_BUILD COMMAND
               ${CMAKE_INSTALL_NAME_TOOL} -change libslide_io.dylib @loader_path/libslide_io.dylib
               $<TARGET_FILE:${BINDLIB_NAME}>)
    endif()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 2018-03-07
      相关资源
      最近更新 更多