python代码交叉编译成so文件

news/2024/10/31 5:28:13/

项目中使用python做算法处理。为了保护源代码,因此编译成so后执行。一开始代码只运行在x86平台,因此编译的时候,直接调用python3 setup.py build_ext --inplace就可以了。但是这两天需要将算法移植到arm平台,但是编译环节还是在x86的电脑上的话,直接调用上面这条语句就没有成功。解决这个问题,有两种办法:

1. 将编译放到arm的硬件中去做。

这个肯定没有问题,事实上,在我没有找到交叉编译的方法之前,就是这么做的。但是这种方法的话,后续做Jenkins发布的时候,就需要新增加一个arm环境的机器,还得装软件,太麻烦。

2. 交叉编译,编译在x86电脑上搞

与是观察python3 setup.py build_ext --inplace的具体操作流程。这里参考了这位大神的文章(很详细)

cython代码编译和setup.py文件编写_cython setup_damonlearning的博客-CSDN博客

再观察打印的流程,发现实际上,整个过程包含3步:

        1. 生成c文件。这个用cython ***.pyd就可以。

        2. 利用gcc,和生成的c文件,去编译生成中间,就是.o文件

        3. 利用gcc进行链接,生成so文件。

上述这3个步骤,第一步,与架构无关,我比较了一下,在arm环境下生成的c和在x86下生成的c,一模一样。后面两步,就和最终so运行的环境相关了。如果在x86下编译,就用x86下的gcc,反之,用arm下的gcc。说到这里,其实经常搞交叉编译的同学,就已经清楚怎么做后续的操作了。

不过,有2个地方比较搞,

1. 就是我的x86电脑是64位的,然后我的arm编译是32位的(arm-linux-gnueabihf-gcc),结果编译的时候,就横竖不行,报错是硬件不匹配。没办法,只能将编译器改为64位的编译器,幸亏实际的硬件也是64位的。

2. 编译过程指定的头文件的版本

我的x86电脑安装的python是3.8的,arm中实际使用的python是3.7的。然后两者的头文件就有差异。导致某些包,在3.8中的存在一个函数,但是在3.7的环境中,该函数不存在,从而发生故障找不到符号。解决办法就是执行第二步的时候,-I指定include头文件夹时,将arm环境中的python头文件夹,拷贝一份到x86电脑上,然后gcc -I该文件夹。

经过这样的操作,最后在x86下编译出来的so文件,在arm下也可以使用


http://www.ppmy.cn/news/40678.html

相关文章

【C++】STL之list的使用和模拟实现

有了之前两个STL中容器和数据结构初阶链表的学习基础,下面list的学习将会简单很多。 目录 (一)list的介绍和使用 (1)list的介绍 (2)list的使用 (二)模拟实现list &a…

不再迷茫 详解 C/C++ 中常用的 5 种文件存在检查方式

程序员必备:C/C 中检查文件是否存在的 4 种方法大比拼引言fopen和fclose(C/C)fopen 函数原型fclose 函数原型示例使用stat或_stat函数 (C/C)stat 函数原型_stat 函数原型示例使用C11及更高版本的std::ifstreamstd::ifstream 类原型std::ios_base::openmode 枚举类型…

BSN季度版本2023年3月31日迭代更新

根据BSN发展联盟规划,区块链服务网络(BSN)于2023年3月31日进行季度版本的迭代更新,在对现有BSN产品功能、性能和服务体验进行优化的同时,还推出多个全新的业务、功能,本文中将按照BSN-DDC基础网络、BSN Spa…

基于Java+SpringBoot+vue的社区维修平台设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍:专注于Java技术领域和毕业项目实战 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例(300套) 目录 一、效果演示 二、…

C++ 枚举(enum)数据结构相关知识

enum数据结构 枚举(enumeration)是C中的一种用户自定义数据类型,它允许为一组整数赋予有意义的名称。枚举类型的主要目的是提高代码的可读性和可维护性。 枚举类型用关键字enum定义。以下是一个简单的枚举类型示例: enum Color {…

磁盘调度算法习题

注意(不论被访问的下一个磁道号是几,计算移动距离都是:大数减小数) 一.磁盘共有200个柱面(0-199),它刚刚从92号磁道移到98号随道完成读写,假设此时系统中等待访问磁盘盘的磁道序列为190&#xf…

Python 判断闰年、Python 平方根

Python 判断闰年 以下实例用于判断用户输入的年份是否为闰年: # -*- coding: UTF-8 -*-# Filename : test.py # author by : www.w3cschool.cnyear int(input("输入一个年份: ")) if (year % 4) 0:if (year % 100) 0:if (year % 400) 0:print("…

REVA首届世界巡回交流会——澳门站 亚太峰会!

近日金融相关媒体报道:REVA亚太峰会将定于2023年5月8日—5月10日在澳门举行为期三天的会议交流,本次峰会由REVA主办,这一次的亚太峰会是疫情放开后国内外互联网市场交流的良好契机,也加速推动着国家和地区间互联网的经济、技术交流与合作。此次首战澳门亚太峰会会议,将拉开Reva…