首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打包未找到库的可执行文件、共享库和Python绑定

打包未找到库的可执行文件、共享库和Python绑定
EN

Stack Overflow用户
提问于 2021-11-20 08:12:34
回答 1查看 241关注 0票数 1

我有一个项目,云量,我想为Python添加绑定,这样我就可以访问一些底层函数。我已经把最初的工作记下来了,在树枝上。由于主可执行文件是用cmake构建的,所以我决定使用scikit构建来管理构建,并使用pybind11来处理绑定(遵循此示例回购)。

当我在虚拟环境中运行pip install .时,一切似乎都如出一辙。我发现可执行文件已安装到<prefix>/bin中,库进入<prefix>/lib,模块进入<prefix>/lib/pythonX.Y/site-packages/cloudgen。事实上,如果我运行pip uninstall cloudgen,所有正确的文件都会被卸载。然而,当我开始测试Python绑定时,我的问题就出现了。我发现了两个独立但相关的问题。

  • 如果我安装在Anaconda环境中,该模块能够解析共享库的路径并通过测试,但是可执行文件不能解析到库的路径。
  • 另一方面,如果我使用python -m venv安装到虚拟环境中,则模块和可执行文件都无法解析到共享库的路径。

在四处搜索时,我看到了这个问题,它说明我可以操作LD_LIBRARY_PATH (或相当于macOS上的DYLD_LIBRARY_PATH或Windows上的PATH ),但也可以操作通常是皱眉的。这个问题提到了悬而未决的问题,它指的是包含额外的构建产品(正如我所说的,这似乎不是我的问题),但并没有解决库路径解析问题。我还遇到了这个问题,询问如何使用scikit-build和直接使用setuptools的这个问题分发构建产品。这两个问题或答案都不涉及库路径解析。

我的问题是:分发包含可执行文件、共享库和Python模块并使路径解析只运行™的包的正确方法是什么?

一个最小的工作示例有点多,但是我用创造了一个要点来演示这种行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-30 00:52:30

经过进一步研究(并仔细阅读RPATH),正确的答案似乎是在安装时显式地设置RPATH。对链接要旨的相关更改是在创建目标(来自链接的Wiki)之后向CMakeLists.txt添加以下内容:

代码语言:javascript
复制
if (SKBUILD)
    find_package(PythonExtensions REQUIRED)
    set(lib_path "${PYTHON_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
else()
    set(lib_path "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
endif()
list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${lib_path}" is_system)
if ("${is_system}" STREQUAL "-1")
    set_target_properties(mwe.exe PROPERTIES
        INSTALL_RPATH_USE_LINK_PATH TRUE
        INSTALL_RPATH "${lib_path}")
    # The following is necessary for installation in a virtual
    # environment `python -m pip venv env`
    set_target_properties(_mwe PROPERTIES
        INSTALL_RPATH_USE_LINK_PATH TRUE
        INSTALL_RPATH "${lib_path}")
endif()

这需要遵循有关设置RPATH的其他细节,例如包含(字面上来自链接的CMake Wiki):

代码语言:javascript
复制
# use, i.e. don't skip the full RPATH for the build tree
set(CMAKE_SKIP_BUILD_RPATH FALSE)

# when building, don't use the install RPATH already
# (but later on when installing)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)

set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

# add the automatically determined parts of the RPATH
# which point to directories outside the build tree to the install RPATH
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

在CMakeLists.txt的早些时候。最终的结果是,这将禁用对已安装的可执行文件和Python模块的库路径的动态搜索(LD_LIBRARY_PATHDYLD_LIBRARY_PATH )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70044257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档