如何将C语言编写的rnnoise库随Python打包的Windows可执行文件分发
解决方案
你当前在Linux环境编译得到的.so是Linux专属动态链接库,无法被Windows平台的可执行文件调用,Windows运行需要对应编译为.dll格式的rnnoise库,你可以直接在Linux设备上通过MinGW交叉编译完成,无需Windows设备。
1 交叉编译Windows版rnnoise.dll
- 安装MinGW编译链,Debian/Ubuntu系执行命令:
apt install gcc-mingw-w64-x86-64 - 进入rnnoise源码目录,执行交叉编译配置:
./configure --host=x86_64-w64-mingw32 --prefix=$(pwd)/build_output - 依次执行
make && make install,编译完成后在build_output/bin路径下即可得到librnnoise.dll文件
2 调整Python动态库加载逻辑
修改你调用rnnoise的代码,适配开发、打包两种运行场景,自动定位动态库路径,示例代码:
import os import sys import ctypes # 区分打包后运行和开发环境运行 if getattr(sys, 'frozen', False): # 打包为exe后的运行路径,取exe所在目录 base_path = os.path.dirname(sys.executable) else: # 开发环境取当前脚本所在目录 base_path = os.path.dirname(os.path.abspath(__file__)) # 按平台加载对应动态库 if sys.platform == 'win32': lib_path = os.path.join(base_path, 'librnnoise.dll') elif sys.platform == 'linux': lib_path = os.path.join(base_path, 'librnnoise.so') else: raise OSError("当前平台暂不支持") rnnoise_lib = ctypes.CDLL(lib_path)
以上逻辑配置完成后,只要把对应平台的动态库放在可执行文件同级目录,程序就能正常加载,无需用户额外配置。
3 打包配置(以常用的PyInstaller为例)
你可以直接通过打包命令指定要捆绑的动态库,也可以通过spec文件配置:
- 单文件打包命令:
pyinstaller --onefile --add-binary "librnnoise.dll;." 你的入口脚本名.py
命令中;是Windows平台的路径分隔符,如果是打包Linux版本则替换为:,打包完成后生成的单个exe就已经包含了dll,用户直接运行即可。 - 文件夹打包命令:
pyinstaller --onedir --add-binary "librnnoise.dll;." 你的入口脚本名.py
打包完成后dist目录下的生成文件夹里,dll会和exe放在同级,直接把整个文件夹分发即可,用户运行文件夹内的exe就能正常调用库。
如果你需要同时支持多平台分发,只需要分别编译对应平台的动态库(Windows用dll、Linux用so、macOS用dylib),打包对应平台版本时引入对应库即可。
内容的提问来源于stack exchange,提问作者Bach Le Duy
相关产品推荐
相关产品推荐

