Windows 下 MSVC 源码编译 PySide2-5.15.2

简介

本来想尝试使用 shiboken2-generator 转换 C++/Qt 为 Python,尝试过程困难重重,最后在看了各种文档后,编译 PySide2 中自带的例子时,发现链接不到 Qt 库,我便猜测是因为我的 Qt 库是因为我用 vs2019 编译的库,但是官方下载的 PySide2 和 shiboken2 不是使用 vs2019 编译的,导致动态库之间的不兼容,因此我决定从编译 PySide2 开始,会编译 PySide2、shiboken2 和 shiboken2_generator

环境配置

  • Visual Studio 2019
  • Qt 5.15.2 (MSVC)
  • Python 3.8.3
  • OpenSSL 3.0.11
  • Libclang 12.0
  • CMake 3.25.3

ps:Qt 5.15.2 和 libclang 12.0 都需要使用 visual studio 配套的,比如这里就要用 vs2019,openssl 也需要编译成动态库,因此我也是使用自己使用 vs2019 编译的

准备好上述环境后,开始配置环境变量,我这里使用的是 powershell

首先,配置 MSVC 环境变量

Import-Module "E:\software\Vs2019\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstallPath "E:\software\Vs2019" -DevCmdArguments "-arch=x64 -host_arch=x64"

上述两条命令,可以加载 MSVC 的环境变量,后面的 -arch 和 -host_arch 是设置 x86 和 x64 平台,替换路径到自己 Visual Studio 的安装路径,为了方便,建议编写为 ps1 脚本

然后,添加 CMake、Qt、Python 到环境变量

# 添加 CMake 环境变量
$env:PATH="E:\software\CMake\cmake-3.25.3-windows-x86_64\bin;"+$env:PATH

# 添加 Python 环境变量
$env:PATH="E:\software\Python\Python38;E:\software\Python\Python38\Scripts;"+$env:PATH

# 添加 Qt cmake find 环境变量
$env:PATH="F:\workenv\cpp\msvc\qt5;"+$env:PATH

上述的 Qt 环境变量是给 cmake 的 find_package 提供查找路径的,我的 Qt 库如下

最后,还需要给 libclang 添加环境变量

$env:LLVM_INSTALL_DIR="E:\software\Clang\libclang-vs2019-12"

 至此,环境变量配置完毕

编译配置

从 Qt 官方或者镜像源中下载 PySide2-5.15.2 源码,其中包括了 shiboken2、shiboken2_generator 的源码,解压源码,进入源码根目录

然后,创建 Python 环境变量,并安装各种 Python 依赖环境

# 创建虚拟环境
python -m venv venv

# 启动虚拟环境
.\venv\Scripts\Activate.ps1

# 安装 wheel 和 packaging
pip install wheel
pip install packaging

# 安装其他依赖
pip install -r requirements.txt

编译

执行 setup.py 开始编译

python setup.py bdist_wheel --qmake="F:/workenv/msvc/qt5/bin/qmake.exe" --cmake="E:/software/CMake/cmake-3.25.3-windows-x86_64/bin/cmake.exe" --openssl="F:/workenv/msvc/openssl/bin" --build-type=all --ignore-git --module-subset="Core,Gui,Widgets,Network,Xml" --skip-docs --verbose-build
  • --module-subset:这个选项可以选择编译的模块

这里需要引入 openssl 的动态库路径

 等待编译完成

ps:编译过程中,在编译 wrapper 代码时可能因为,你自己编译的 Qt 缺少某些库,导致无法生成对应的 wrapper 代码,导致编译报错,文件不存在,可以在对应库的 CMakeLists.txt 中注释掉,比如,我编译的 Qt 没有支持 opengl,因此在 QtGui 和 QtWidgets 中某些跟 opengl 有关的东西无法编译,我就注释掉了,也能正常编译

编译完成后,在 dist 目录下,会生成对应的 whl 文件

安装

将上述生成的三个 whl 文件拷贝到一个测试项目中,然后 pip 安装

pip install .\PySide2-5.15.2-5.15.2-cp38-cp38-win_amd64.whl .\shiboken2-5.15.2-5.15.2-cp38-cp38-win_amd64.whl .\shiboken2_generator-5.15.2-5.15.2-cp38-cp38-win_amd64.whl

测试

安装后,就是需要测试,编译 pyside 自带的例子,进入到 pyside2 安装目录,找到 examples 里面的 widgetbinding 目录

cd .\venv\Lib\site-packages\PySide2\examples\widgetbinding

 开始编译

mkdir build
cd build
cmake -G "NMake Makefiles" -D CMAKE_BUILD_TYPE=Release ..
cmake --build .
cmake --install .

编译完成后,执行 main.py 运行程序

至此,测试成功

总结 

以上便是本次编译 PySide2 的全部过程,编译过程困难重重,因此记录下这次编译过程,如有什么其他问题,欢迎在讨论指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值