win平台源码编译python静态库和一些坑
使用静态库的坑点
出现 No module named ‘encodings’ 的问题
这里的问题是没有执行Py_SetPath设置包路径
有可能用到本地设置的python环境变量导致一些莫名的问题和import问题
使用Py_SetPythonHome解决
设置了这两个之后出现 No module named ‘winver’ 的问题
这个问题就巨坑了 这个模块是 python 源代码中使用 dll 编译才有的模块
可以修改 Lib/site.py 代码或者CPython源码结局这个问题(这里没发现可以通过配置参数的方式进行修改的方法,哎)。
根据这个函数的说明改了一下
其他的以下内容转载自这里
其他的以下内容原文链接 https://blog.csdn.net/ark2022/article/details/123602714
本文主要介绍:
1.python3源码的下载和编译内核工程(pythoncore)
2.编译的lib和dll使用例子。
若需要编译源码PCBuild下其他python工程,类似参考内核工程(pythoncore)编译的方式进行配置即可。
一.python源码下载
1.进入python官方网站:Python Source Releases | Python.org
2.选择想要下载的源码版本,这里我们选择3.9.10版本,点击:Download Gzipped source tarball,进行源码压缩文件下载。
3.对下载后的文件:Python-3.9.10.tgz,进行解压缩,得到的源码目录如下:
二.本地系统环境说明
笔者的环境如下:
操作系统:Win11 64位
VS版本:Visual Studio 2022
注意:源码的PC编译解决方案(pcbuild.sln)放在源码目录的PCBuild文件下,编译的一些说明信息,详见文件夹下的readme.txt,注意VS的版本要求,这里要求时2017以上的VS版本,笔者用的是VS2022:
三.内核工程(pythoncore)的静态链接库lib编译和使用
1.编译步骤:
1.打开PCbuild路径下的pcbuild.sln解决方案文件,若版本比2017高,打开时会自动进行解决方案升级,按照提示进行升级即可,对编译没有影响。
2.参考PcBuilid目录下的readme.txt,对内核工程pythoncore进行编译配置(注意,readme.txt说明的是Release版的编译,笔者此处的例子是Debug版本编译):
1).右键pythoncore工程->属性->选择Debug/x64。(这里以Debug版本的64位操作系统作为例子配置, 读者也可以自由选择Release/Win32,根据自己需要配置即可)
2).设置配置属性,将动态DLL配置为静态库(.lib)
3).修改预编译宏,将Py_ENABLE_SHARED修改为Py_NO_ENABLE_SHARED:
4).修改运行库,将:多线程调试DLL(/MDd),修改为:多线程调试(/MTd)。(注意: 若配置Release编译,则这里需要修改运行库选项为:多线程(/MT)):
3.右键pythoncore编译生成lib文件,由于是debug编译,因此生成的文件名为:python39_d.lib。若为Release,则文件名为:python39.lib
2.使用步骤
1.创建一个win32空项目,命名为test
2.将PCBuild文件夹下的include目录、PC目录、Lib目录,复制到test项目目录下:
3.配置项目属性(Debug/x64)(注意:需要与编译的lib属性配置一致,否则会链接异常)
1).添加刚刚复制的Include和PC目录为头文件包含目录
2).设置运行时属性,与python39_d.lib的运行时属性一致,这里为:多线程调试(/MTd)
3).添加预编译宏:Py_NO_ENABLE_SHARED
4).将编译的lib文件,放到test工程目录下,并添加四个依赖库文件:python39_d.lib,Version.lib,Ws2_32.lib,Pathcch.lib
4.添加main代码文件,代码如下:
- //main.cpp
- #include "Python.h"
- int main(int argc, char* argv[])
- {
- Py_Initialize();
- if (!Py_IsInitialized())
- return 0;
- PyRun_SimpleString("print('hello world!')");
- Py_Finalize();
- return 1;
- }
5.编译运行:
3.常见错误
1.编译的lib的编译配置,与运行程序test使用的编译配置不一致,如:lib编译使用的是Debug/x64,而运行程序使用的是Release/Win32等,会导致链接异常。需要检查保持编译配置一致
2.运行程序未添加windows库lib文件,导致某些接口链接找到不实现从而链接异常(解决方法为添加对应的库(例如Version.lib,Ws2_32.lib,Pathcch.lib),具体baidu即可),报错如:
3.运行程序test,未添加宏定义:Py_NO_ENABLE_SHARED,或lib编译时未修改Py_ENABLE_SHARED为Py_NO_ENABLE_SHARED,会导致链接异常,具体错误信息如:
4.遗漏将Lib,Include,PC等目录放到工程上,或者配置相关路径错误,都会导致test项目编译异常。5.若本地安装了其他python版本,并且设置了python系统环境变量,可能会导致test工程运行时异常,可以在Py_Initialize函数执行之前强制设置当前编译源码的Lib所在的路径(此处为放到了test目录下),如:
四.内核工程(pythoncore)的动态链接库dll编译和使用
1.编译
1.打开PCbuild路径下的pcbuild.sln解决方案文件,若版本比2017高,打开时会自动进行解决方案升级,按照提示进行升级即可,对编译没有影响(截图参考编译lib)。
2.选择编译配置:Debug/x64
3.右键pythoncore工程进行编译,编译成功产生dll文件(python39_d.dll)和导入lib文件(python39_d.lib)。(注意:这里的导入lib文件与上面静态编译的lib文件是不一样的文件)
2.使用
1.创建一个win32空项目,命名为test2
2.将python源代码目录文件夹下的include目录、PC目录、Lib目录、编译的dll文件(python39_d.dll),导入lib文件(python39_d.lib),都放到test2工程目录下:
3.配置项目属性(Debug/x64),注意:(Debug/x64)需要与编译的dll编译属性配置一致,否则会链接异常
1).将python源代码目录下的Include和PC目录为头文件包含目录
2).设置运行时属性,与python39_d.dll的运行时属性一致,这里为:多线程调试DLL(/MDd)
3).添加依赖库文件:python39_d.lib
4.添加main代码文件,代码如下:
- //main.cpp
- #include "Python.h"
- int main(int argc, char* argv[])
- {
- Py_Initialize();
- if (!Py_IsInitialized())
- return 0;
- PyRun_SimpleString("print('hello world2!')");
- Py_Finalize();
- return 1;
- }
5.编译运行
win平台源码编译python静态库和一些坑相关推荐
- 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...
- php源码 gd,CentOS7(lnmp环境)php源码编译安装gd库
源码编译安装php5.6的时候,为投省事,只安装了mbstring和php-fpm扩展,其他的都没有–enable进去.不过如果所有的扩展都enale进去的话,运行configure脚本的时候会崩溃掉 ...
- 计算机毕业设计(附源码)python优库仓库管理系统
项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+Navicat11+Django+nodejs. 项目技术: dj ...
- CEF源码编译和生产库的使用
CEF版本是Branch 2171 开发环境是VS2012 查看一下libcef_dll_wrapper工程属性,确定Code Generation 选择MTD(Debug) 或者MT(Release ...
- python语言表白源码-表白 - python代码库 - 云代码
[python]代码库from turtle import * from time import sleep def go_to(x, y): up() goto(x, y) down() def b ...
- 【Django毕业设计源码】Python考试题库练习系统
目录 一.程序介绍: 三.文档目录: 四.运行截图: 五.数据库表: 六.代码展示: 七.更多学习目录: 八.互动留言 一.程序介绍: 文档:开发技术文档.参考LW.答辩PPT,部分项目另有其他文档 ...
- windows平台源码编译最新版openssl
本文有问题,待改中................. 1.从openssl官网下载最新版openssl https://www.openssl.org/source/ The latest ...
- 银河麒麟系统FT2000 ARM64平台源码编译grub2并制作启动U盘 引导启动长城UF716笔记本
编译grub2参考之前的文章 https://blog.csdn.net/hknaruto/article/details/126120947 插入U盘,创建一个分区,vfat格式化 sudo mkf ...
- 解决源码编译Python3后缺少ssl tkinter,bz2等库的问题
Python3以后,使用源码编译python时默认不会包含ssl,tkinter等库,这意味着在调用"import _ssl"或者"import _tkinter&quo ...
最新文章
- php——数据库操作之规范性
- 作为前端开发,如何高效学习 TypeScript
- 建议看 | 计算机网络核心概念
- oracle修改filesystem,oracle数据库 boost::filesystem使用例子
- Spring中注入List,Set,Map,Properties的xml文件配置方法
- ArcGIS 制作林地成分栅格数据
- 图像像素点赋值_OpenCV学习笔记(二)之图像阈值化
- XSS测试平台源码——免费分享
- python 去除txt文本内容重复值
- excel查找并高亮展示重复值
- 笔记本摄像头计算机,笔记本摄像头怎么开
- 2022-2028全球环氧水泥地坪漆行业调研及趋势分析报告
- 让remix使用本地文件系统
- 程序龙的密码(递归算法)
- android 卡联系人导入iphone,苹果手机怎么把通讯录导入新手机sim卡
- 编译镜像(映像).img文件
- Eclipse在线安装主题(color theme)以及安装color theme第三方主题(图文)
- 26个节省时间的Vue提示
- python安装第三方包_python 怎么安装第三方包
- 南京小米二面 全程58分钟
热门文章
- 人工智能洗衣机教程_什么是“智能洗衣机”,我需要一个吗?
- 电脑无法开机,怎么重装系统?
- 【array-java】531. Lonely Pixel I
- x86服务器(HP/DELL/IBM)测试分析(上)
- vfifo控制mig_Xilinx MIG IP核的研究及大容量数据缓冲区的实现
- 【JavaScript】JS实用案例分享:选择器组件 | 简易计算器
- vmware linux centos 安装 vscode 打不开怎么办 No protocol specified Unable to open X display.
- 批量修改文件名的软件Bulk Rename Utility
- css3动画transform-太极图
- 东软c语言培训,东软实训心得_liujingyun的技术博客_51CTO博客