Generates import libraries for the Python DLL (either python3.dll
or python3y(t).dll
) for MinGW-w64 and MSVC (cross-)compile targets.
This crate does not require Python 3 distribution files to be present on the (cross-)compile host system.
This crate uses the binutils dlltool
program to generate the Python DLL import libraries for MinGW-w64 targets. Setting PYO3_MINGW_DLLTOOL
environment variable overrides the default dlltool
command name for the target.
Note: MSVC cross-compile targets require either LLVM binutils or Zig to be available on the host system. More specifically, python3-dll-a
requires llvm-dlltool
executable to be present in PATH
when targeting *-pc-windows-msvc
from Linux.
Alternatively, ZIG_COMMAND
environment variable may be set to e.g. "zig"
or "python -m ziglang"
, then zig dlltool
will be used in place of llvm-dlltool
(or MinGW binutils).
Since version 0.16.5, the pyo3
crate implements support for both the Stable ABI and version-specific Python DLL import library generation via its new generate-import-lib
feature.
In this configuration, python3-dll-a
becomes a pyo3
crate dependency and is automatically invoked by its build script in both native and cross compilation scenarios.
[dependencies] pyo3 = { version = "0.16.5", features = ["extension-module", "abi3-py37", "generate-import-lib"] }
[dependencies] pyo3 = { version = "0.16.5", features = ["extension-module", "generate-import-lib"] }
If an older pyo3
crate version is used, or a different Python bindings library is required, python3-dll-a
can be used directly from the crate build script.
The examples below assume using an older version of PyO3.
The following cargo build script can be used to cross-compile Stable ABI PyO3 extension modules for Windows (64/32-bit x86 or 64-bit ARM) using either MinGW-w64 or MSVC target environment ABI:
fn main() { if std::env::var("CARGO_CFG_TARGET_OS").unwrap() == "windows" { let cross_lib_dir = std::env::var_os("PYO3_CROSS_LIB_DIR") .expect("PYO3_CROSS_LIB_DIR is not set when cross-compiling"); let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap(); let env = std::env::var("CARGO_CFG_TARGET_ENV").unwrap(); let libdir = std::path::Path::new(&cross_lib_dir); python3_dll_a::generate_implib_for_target(libdir, &arch, &env) .expect("python3.dll import library generator failed"); } }
A compatible python3.dll
import library file named python3.dll.a
or python3.lib
will be automatically created in the directory pointed by the PYO3_CROSS_LIB_DIR
environment variable.
PYO3_CROSS_LIB_DIR=target/python3-dll cargo build --target x86_64-pc-windows-gnu
As an advanced feature, python3-dll-a
can generate Python version specific import libraries such as python39.lib
or python313t.lib
.
See the ImportLibraryGenerator
builder API description for details.
This crate embeds Module-Definitions based on the stable_abi.toml
file from CPython.
The upstream version of this file is located in the CPython project repository under the path Misc/stable_abi.toml
.