簡體   English   中英

編譯 maturin 包的正確方法是什么?

[英]What's the correct way to compile maturin packages?

我正在開發一個 Rust 庫,該庫使用 PyO3 進行 Python 綁定,這些綁定是使用 maturin 構建的。

問題

如果我在我的操作系統(Arch,使用 Glibc 2.31)上構建綁定,則 generated.whl 不適用於舊系統,因為 Glibc 不兼容並引發錯誤,例如:

ImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found 
(required by /home/travis/virtualenv/python3.7.1/lib/python3.7/site-packages/my_package.cpython-37m-x86_64-linux-gnu.so)

當前的解決方法

為了解決這個問題,我們正在centos 6.9上構建我們的綁定,它具有 Glibc 2.12,因此“應該兼容”幾乎所有 Linux 發行版。

實際問題

這顯然只是一種解決方法,應該有更好的解決方案。

編譯 maturin 庫以使其適用於大多數 Linux 發行版的正確方法是什么?

據我了解,這就是manylinux 標准的用途,那為什么它不起作用呢? 我錯過了什么?

我的假設和測試

我想一個可能的解決方案是將 Glibc 靜態鏈接到庫中,因此針對用於static編譯的 musl。

是否有可能做到這一點? 我發現 這個博客表明它可以完成,但我看到在 .whl 文件(只是 python 可安裝檔案)內部有一個.so ,因此是一個共享庫。

甚至可以構建一個使用 musl 靜態鏈接 libc 的共享庫嗎?

我找到了一個可能的工作示例:在tf_nightly-2.4.0.dev20200710-cp36-cp36m-manylinux2010_x86_64 ,有文件/tensorflow/python/_pywrap_utils.so

file _pywrap_utils.so                                                                                       [2]
_pywrap_utils.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), statically linked, BuildID[md5/uuid]=aee3c5fa4ae1243775857b2643b80ea0, not stripped

但它似乎無論如何都是動態鏈接的:

ldd _pywrap_utils.so
        linux-vdso.so.1 (0x00007fffb3782000)
        libtensorflow_framework.so.2 => not found
        _pywrap_tensorflow_internal.so => not found
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f5c95672000)
        libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f5c95658000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007f5c95491000)
        libm.so.6 => /usr/lib/libm.so.6 (0x00007f5c9534a000)
        /usr/lib64/ld-linux-x86-64.so.2 (0x00007f5c95a9f000)```

那么這真的可能嗎?

有些人,強烈建議不要這樣做,這是為什么呢? 我得到在同一個可執行文件中線程和分配器的不同實現可能會導致兼容性問題。

我試圖改變Cargo.toml

[lib]
crate-type = ["cdylib"]

對此(如此處所示

[lib]
crate-type = ["staticlib"]

但馬圖林似乎對此並不高興。

💥 maturin failed
  Caused by: Cargo didn't build a cdylib. Did you miss crate-type = ["cdylib"] in the lib section of your Cargo.toml?

也許這可以通過編譯標志crt-static來完成?

顯然,這樣做的假定方法是編譯官方manylinux1 docker 內部的庫。

可以通過以下方式完成:

sudo docker run --rm -v $(pwd):/io konstin2/maturin build --release

暫無
暫無

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

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