我有一个项目,云量,我想为Python添加绑定,这样我就可以访问一些底层函数。我已经把最初的工作记下来了,在树枝上。由于主可执行文件是用cmake构建的,所以我决定使用scikit构建来管理构建,并使用pybind11来处理绑定(遵循此示例回购)。
当我在虚拟环境中运行pip install .时,一切似乎都如出一辙。我发现可执行文件已安装到<prefix>/bin中,库进入<prefix>/lib,模块进入<prefix>/lib/pythonX.Y/site-packages/cloudgen。事实上,如果我运行pip uninstall cloudgen,所有正确的文件都会被卸载。然而,当我开始测试Python绑定时,我的问题就出现了。我发现了两个独立但相关的问题。
python -m venv安装到虚拟环境中,则模块和可执行文件都无法解析到共享库的路径。在四处搜索时,我看到了这个问题,它说明我可以操作LD_LIBRARY_PATH (或相当于macOS上的DYLD_LIBRARY_PATH或Windows上的PATH ),但也可以操作通常是皱眉的。这个问题提到了悬而未决的问题,它指的是包含额外的构建产品(正如我所说的,这似乎不是我的问题),但并没有解决库路径解析问题。我还遇到了这个问题,询问如何使用scikit-build和直接使用setuptools的这个问题分发构建产品。这两个问题或答案都不涉及库路径解析。
我的问题是:分发包含可执行文件、共享库和Python模块并使路径解析只运行™的包的正确方法是什么?
一个最小的工作示例有点多,但是我用创造了一个要点来演示这种行为。
发布于 2021-11-30 00:52:30
经过进一步研究(并仔细阅读RPATH),正确的答案似乎是在安装时显式地设置RPATH。对链接要旨的相关更改是在创建目标(来自链接的Wiki)之后向CMakeLists.txt添加以下内容:
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):
# 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_PATH或DYLD_LIBRARY_PATH )。
https://stackoverflow.com/questions/70044257
复制相似问题