You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux交叉编译Win64 Python包导入时DLL加载失败求助

交叉编译Windows x64 Python包导入失败问题

背景:在Linux机器上使用x86_64-w64-mingw32交叉编译器,通过SWIG封装C++代码、CMake构建、setuptools打包win_amd64版本的Python包,遇到导入异常。

使用的工具及版本

  • SWIG:4.1.1
  • CMake:3.27
  • Linux环境Python:3.9.18(用于运行setuptools)
  • 交叉编译工具链:x86_64-w64-mingw32
  • Linux发行版:Ubuntu 20.04
  • Windows Python 3.9 AMD64开发包:已下载dev.msi并提取到本地目录

补充说明:

  • 可正常构建linux-x86_64平台Python3.6+版本包
  • Windows平台下,仅能通过libpython36.a构建Python3.6版本包;更高版本(如3.9)的win_amd64包必须使用libpython39.lib(基于Lib的库)

当前问题现象

  1. 已成功构建win_amd64版本whl文件,CMake可生成.dll,setuptools封装流程无异常
  2. 在Windows Python3.9 x64上安装该包无任何警告
  3. 导入模块时报错:
import sample  # 模块名称
# 错误信息如下
Traceback:
from . import _sample_swig
ImportError: DLL load failed: The specified module could not be found.

项目配置

1. SWIG相关CMake配置

FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})
CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
SET(PYTHON_MODULE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/sample)
set(PYTHON_EXECUTABLE python${PYTHON_BUILD_VERSION})
if (${BUILD_PLATFORM} MATCHES "Windows")
    set(CMAKE_SYSTEM_NAME Windows)
    set(CMAKE_C_COMPILER   /usr/bin/x86_64-w64-mingw32-gcc)
    set(CMAKE_CXX_COMPILER /usr/bin/x86_64-w64-mingw32-g++)
    set(PYTHON_LIBRARY /home/developer/workspace/69/py39/libs/python.lib)
    set(PYTHON_INCLUDE_DIR /home/developer/workspace/69/py39/include)
    set(TARGET_EXTENSION "pyd")
    set(CMAKE_FIND_ROOT_PATH /opt/win_cross_compile_libs)

ELSE()
    set(CMAKE_C_COMPILER /usr/bin/gcc)
    set(CMAKE_CXX_COMPILER /usr/bin/g++)
    set(TARGET_EXTENSION "so")
    set(PythonLibs_DIR /usr/lib/x86_64-linux-gnu/)
    set(CMAKE_FIND_ROOT_PATH /usr/lib/x86_64-linux-gnu/)
ENDIF()
project(sample LANGUAGES CXX)
set(CMAKE_LANGUAGE_COMPILER ${CMAKE_CXX_COMPILER})
FIND_PACKAGE(Python3 COMPONENTS Interpreter Development)
FIND_PACKAGE(PythonLibs)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/include)
message(STATUS "Py Libs: ${PYTHON_LIBRARIES}")
message(STATUS "Add. Linking Flags: ${ADD_LINK_FLAGS}")
message(STATUS "Python Incl Dir: ${PYTHON_INCLUDE_DIR}")
message(STATUS "Python Module: ${PYTHON_MODULE_DIR}")
message(STATUS "Machine: ${CMAKE_SYSTEM_NAME}")
set(PythonLibs_DIR "/usr/lib/x86_64-linux-gnu/")
set_property(SOURCE include/sample.i PROPERTY CPLUSPLUS ON)
file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp)
swig_add_library(sample_swig TYPE SHARED
          LANGUAGE python
          OUTPUT_DIR ${PYTHON_MODULE_DIR}
          OUTFILE_DIR src
          SOURCES include/sample.i ${SRC_FILES}
          )
SWIG_LINK_LIBRARIES(sample_swig ${PYTHON_LIBRARIES})
add_custom_command(
TARGET _sample_swig POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
     _sample_swig.${TARGET_EXTENSION}
     ${PYTHON_MODULE_DIR}/_sample_swig.${TARGET_EXTENSION}
)

INSTALL(TARGETS _sample_swig LIBRARY DESTINATION sample)

2. SWIG接口文件

%module arithmetic_operator
%{
    #include "addition.h"
%}
%include "addition.h"
%include "stdint.i"

3. 头文件(addition.h)

#include <iostream>
using namespace std;

int addition_fn(int a, int b)
{
    return (a+b);
}

4. C++文件(src目录下)

#include <iostream>
using namespace std;
const int MAX_ADDABLE = 50;
int main()
{
    cout<<"Hello World\n";
}

5. Setup.py

from skbuild import setup

setup(
name='sample',
version='0.1.0',
description='Sample',
cmake_with_sdist=True,
packages=['sample'],
python_requires=">=3.6",
include_package_data=True,
zip_safe=False
)

已尝试的解决方法

使用os.add_dll_directory(<site-packages/sample目录路径>)(因Python3.8+仅从可信源加载DLL,即使PYTHONPATH已配置),但问题未解决。


内容的提问来源于stack exchange,提问作者VijayasaiVS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:06:00