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的库)
当前问题现象
- 已成功构建win_amd64版本whl文件,CMake可生成.dll,setuptools封装流程无异常
- 在Windows Python3.9 x64上安装该包无任何警告
- 导入模块时报错:
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
相关产品推荐
相关产品推荐

