簡體   English   中英

分發鏈接到第三方庫的 pybind11 擴展

[英]Distributing pybind11 extension linked to third party libraries

我正在研究用 C++ 編寫的 pybind11 擴展,但我很難理解它應該如何分發。

該項目鏈接到許多第三方庫(例如 libpng、glew 等)。

該項目使用 CMAKE 構建良好,並生成一個 .so 文件。 現在我不確定安裝此擴展程序的正確方法是什么。 擴展似乎有效,就好像我嘗試將文件復制到它被拾取的 python lib 目錄中(我可以導入它,並且它工作正常)。 但是,我認為這顯然不是通往 go 的方式。

我還嘗試了 setuptools 路由(來自https://pybind11.readthedocs.io/en/stable/compiling.html ),方法是創建一個 setup.py 文件,如下所示:

import sys

# Available at setup time due to pyproject.toml
from pybind11 import get_cmake_dir
from pybind11.setup_helpers import Pybind11Extension, build_ext
from setuptools import setup
from glob import glob

files = sorted(glob("*.cpp"))

__version__ = "0.0.1"

ext_modules = [
    Pybind11Extension("mylib",
        files,
        # Example: passing in the version to the compiled code
        define_macros = [('VERSION_INFO', __version__)],
        ),
]

setup(
    name="mylib",
    version=__version__,
    author="fab",
    author_email="fab@fab",
    url="https://github.com/pybind/python_example",
    description="mylib",
    long_description="",
    ext_modules=ext_modules,
    extras_require={"test": "pytest"},
    cmdclass={"build_ext": build_ext},
    zip_safe=False,
    python_requires=">=3.7",
)

現在我可以通過簡單地調用來構建擴展

pip3 install

但是看起來所有鏈接都斷開了,因為每當我嘗試在 Python 中導入擴展時,我都會收到鏈接錯誤,就好像 setuptools 沒有正確地將擴展與第 3 方庫鏈接一樣。 例如與 libpng 鏈接時的錯誤,如下所示:

>>> import mylib
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /home/fabrizio/.local/lib/python3.8/site-packages/mylib.cpython-38-x86_64-linux-gnu.so: undefined symbol: png_sig_cmp

但是我不知道如何將此鏈接信息添加到設置工具,甚至不知道這是否可能(它應該是相當於 CMAKE 的 target_link_libraries 的設置工具)。 在閱讀了數周的文檔、論壇主題和失敗的嘗試后,我真的不知所措。 如果有人能夠以正確的方式指出我或清除一些迷霧,我將不勝感激!

謝謝! 很棒

/home/fabrizio/.local/lib/python3.8/site-packages/mylib.cpython-38-x86_64-linux-gnu.so: undefined symbol: png_sig_cmp

這條線幾乎說得很清楚。 您的本地共享 object 文件.so找不到它所鏈接的libpng.so

您可以通過運行來確認這一點:

ldd /home/fabrizio/.local/lib/python3.8/site-packages/mylib.cpython-38-x86_64-linux-gnu.so

setuptools 中沒有 target_link_libraries target_link_libraries()的等價物。 因為那沒有任何意義 該庫已經構建並且您已經鏈接了它。 這是您的系統或多或少地告訴您它找不到所需的庫。 那些最有可能需要安裝。

這也是 Linux 發行版提供自己的 package 管理器以及為什么您應該使用所述發行版提供的developer包的原因之一。

那么你如何解決這個問題? 那么您的.so文件需要找到您所鏈接的其他.so文件以了解其工作原理,我將向您推薦此鏈接

我的主要猜測是基於這樣一個事實,即當您手動復制文件時它會起作用——在構建過程中您可能指定了本地目錄的rpath 因此,您最有可能需要做的是指定您的安裝工具在安裝時需要復制這些文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM