首页 > 编程语言 >Python3源码编译和使用静态链接库lib&动态链接库dll详细介绍

Python3源码编译和使用静态链接库lib&动态链接库dll详细介绍

时间:2023-05-24 19:23:46浏览次数:47  
标签:lib Py 链接库 dll 编译 源码 目录

说明:
本文主要介绍:

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.编译运行

 

标签:lib,Py,链接库,dll,编译,源码,目录
From: https://www.cnblogs.com/tomato-haha/p/17429281.html

相关文章

  • 「解题报告」LOJ561 「LibreOJ Round #9」CommonAnts 的调和数
    模拟赛考的题,但是模拟赛没有打,哈哈,摆烂。考场上想到大致做法了,没继续推,去打GPofTokyo了。首先发现操作都在查询前面,所以我们只需要预处理出答案即可。我们先记\(b_i\)表示对\(i\)进行的操作的总和,那么容易写出\(a_i\)的式子:\[a_i=\sum_{j|i}b_j\cdot\frac{i......
  • 【服务治理】基于SpringCloudAlibaba微服务组件的灰度发布设计(二)
    一.背景在上文中,灰度发布遇到了些问题,例如:1.动态修改Nacos配置中心的元数据信息,如何同步到Nacos注册中心对应服务的列表中2.管理后台业务调用其它服务灰度实例时的路由规则二.解决方案//TODO ......
  • 【Netty 从成神到升仙系列 大结局】全网一图流死磕解析 Netty 源码
    ......
  • 博学谷学习记录 自我总结 用心分享 | Alibaba- GateWay
    SpringCloudNetflix项目进入维护模式,SpringCloudNetflix将不再开发新的组件,我们知道SpringCloud版本迭代算是比较快的,因而出现了很多中岛的ISSUE都来不及Fix就又推另一个Release了。进入维护模式意思就是目前已知以后一段时间SpringCloudNetflix提供的服......
  • ffmpeg 下载链接(exe,源码,include,lib,dll,a,so)
    Releasen4.2.9·FFmpeg/FFmpeg(github.com) 源码DownloadFFmpeg 官网exeBtbN/FFmpeg-Builds(github.com) build,可以编译的,可以下载动态库,可以生成编译文件......
  • 09获取权限源码阅读记录
    类关系图属于Volo.Abp解决方案的类:PermissionDefinitionManager属于Volo.Abp.PermissionManagement解决方案的类:PermissionsControllerPermissionAppServicePermissionManagerPermissionManagementProviderEfCorePermissionGrantRepository属于Volo.Abp.Identity解......
  • 基于springboot+vue数码论坛系统设计与实现、论坛管理系统,附源码+数据库+lw文档+PPT
    1、项目介绍考虑到实际生活中在数码论坛方面的需要以及对该系统认真的分析,将系统权限按管理员和用户这两类涉及用户划分。(1)系统功能需求登录系统后,主要模块包括首页、数码板块、数码评价、数码论坛、畅聊板块、新闻资讯、个人中心、后台管理等功能。系统功能用例图如图3-1所示......
  • AIGC源码-架构图智能生成系统
    近日,微软发布guidance模块库,并迅速登上github网站TOP榜首:guidance,传统的提示或链接更有效、更高效地控制新式语言模型。协助用户将生成、提示和逻辑控制交错到单个连续流中,以匹配语言模型实际处理文本的方式。简单的输出结构,如思维链及其许多变体(例如ART,Auto-CoT等)已被......
  • Redis源码安装(Linux环境)
     下载源码:wgethttps://download.redis.io/redis-stable.tar.gz  解压:tar-xzvfredis-stable.tar.gz  编译&安装:cdredis-stablemakePREFIX=~/redisinstall    =================================== ......
  • 红包雨的架构设计及源码实现 中奖代码设计 一般有用 看1
    1.项目介绍学习目标系统的功能、背景、场景及需求在架构角度思索系统可能面临的问题以及解决方案运用中间件特性,完成架构设计主业务源码分析微服务的部署与动态扩容1.1项目概述1.1.1概述京东的红包雨大家可能都参与过,在某段时间内随机发放不同的红包,如果公司让你设计类似......