python生成动态链接库_Linux下编译Windows C++生成动态链接库(libxxx.so)-程序员宅基地

技术标签: python生成动态链接库  

1. 简介

在python、java等语言中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互。因此就需要使用到链接库(动态库和静态库,注:这里只介绍动态库)。而本文主要介绍的是跨平台编译:针对windows系统中的C++程序在linux编译成动态链接库的过程。

2. .so及.dll介绍

2.1 .dll

Windows下动态链接库以 .DLL 事实上和 EXE 文件一样,同属 PE 格式的执行文件。对于隐式的引用外部符号,需要把外部符号所在的位置写在 PE 头上。PE 加载器将从 PE 头上找到依赖的符号表,并加载依赖的其它 DLL 文件。

windows 可以存在一个dll 对另一个 dll 的隐式依赖。windows的这种dll机制在著名教科书《程序员的自我修养》里仔细分析过。windows搞的这么麻烦,其实就是考虑到调用dll接口时的效率。

2.2 .so

在Linix 下,.so 为共享库,是shared object,用于动态连接的(通常还以 lib 开头)。so 文件大多为 elf 执行文件格式。当它们需要的外部符号,可以不写明这些符号所在的位置。即通常so 文件并不知道它依赖的那些符号在哪些 so 里面。这些符号是由调用 dlopen 进程运行时提供的。dlopen 把这些符号通报给 dlopen 加载的 .so 文件,最终完成动态链接。

Linix 下一般不需要让 so和 so 有隐式依赖关系。效率方面linux也支持另一种so机制,编译so时不加 -fPIC 的,可以用内存空间换调用时间。

2.3 .so和.dll比较分析

由于操作系统的不同,他们在许多方面还是不尽相同,下面从以下几个方面进行阐述。

(1) 动态库程序编写,在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数作为初始化的人口,通常在导出函数的声明时需要有 _declspec(dllexport)关键字。Linux下的gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要到函数做特别声明,编写比较方便。

(2)动态库编译,在windows系统下面,有方便的调试编译环境,通常不用自己去编写makefile文件,但在linux下面,需要自己动手去编写makefile文件。

(3)动态库调用方面,Windows和Linux对其下编制的动态库都可以采用显式调用或隐式调用,但具体的调用方式也不尽相同。

(4) 动态库输出函数查看,在Windows中,有许多工具和软件可以进行查看DLL中所输出的函数,例如命令行方式的dumpbin以及VC++工具中的 DEPENDS程序。在Linux系统中通常采用nm来查看输出函数,也可以使用ldd查看程序隐式链接的共享对象文件。

(5)对操作系统的依赖,这两种动态库运行依赖于各自的操作系统,不能跨平台使用。因此,对于实现相同功能的动态库,必须为两种不同的操作系统提供不同的动态库版本。

3. Linux下编译.so

3.1  附加库

由于编译的是Windows上的C++代码,其中使用了附加的mysql、opencv及ffmpeg库,因此在Linux上重新编译配置了相应版本的库。将相应编译好的库下面lib和include路径记录下来在makefile中使用。

3.2  Linux下C/C++及附加库安装配置

1)安装C/C++编译器:

2)C/C++程序编译 与 调试

注:使用 ”-tui “ 选项可以将代码显示在文本用户界面TUI。可用光标操控同时在下面的GDB shell中输入命令: $ gdb -tui [可执行程序名]

31102e51c95f?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin

3)安装eclipse进行C/C++开发

4)安装ffmpeg

5)安装opencv3.3

6)安装mysql

注:python导入mysql库:$ sudo yum install MySQL-python

3.3  Makefile文件

Makefile是类unix环境下(比如Linux)的类似于批处理的"脚本"文件。其基本语法是: 目标+依赖+命令。Makefile 文件描述了整个工程的编译、连接等规则。有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。

1) 规则:

Makefile文件由一系列规则(rules)构成。每条规则的形式如下,上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。

2)语法:

包括:注释、回声、通配符、模式匹配、变量和赋值符、变量和赋值符、自动变量、判断和循环、函数等。

3)示例:

31102e51c95f?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin

3.4  注意的问题

将windows下的C++代码放在linux上编译时除了一些头文件导入路径稍作修改外还有一些函数的修改如:

1)windows C++中的sprintf_s()  ->  Linux下的sprintf():

那么一举两得的方法是既能在Windows的C++中编译也可以在linux上编译的方法是:

在C++代码中加入定义:#ifdef _WIN64

#define _CRT_SECURE_NO_WARNINGS

#endif

2. windows C++中的_itoa_s()   -> Linux未定义:

我们可以使用sprintf()函数实现该功能:char buffer[20]

int n = 123456;

sprintf(buffer,"%d",n);

4. 应用

4.1 python调用.so

当需要采用调用c++的程序的时候,需要对原有的数据加一个extern "C"封装一下即可。采用g++编译的代码也需要的,原因可能是因为c++编译器编译后的二进制so文件中,对c++的函数进行了重新的命名导致的。

4.2 ctypes库

ctypes使得python能够直接调用c语言开发的动态链接库,非常强大。

为了使用ctypes,须依次完成以下步骤:

* 编写动态连接库程序

* 载入动态连接库

* 将Python的对象转换为ctypes所能识别的参数

* 使用ctypes的参数调用动态连接库中的函数

1)导入.soimport ctypes

so=ctypes.CDLL('/root/VideoCompute/libKeyFrame.so')

so.get_hashfamily()

2) 数据类型

ctypes 提供了一些原始C语言兼容的数据类型。第一列是在ctypes库中定义的变量类型,第二列是C定义的变量类型,第三列是Python在不使用ctypes时定义的变量类型。

31102e51c95f?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin

5. 总结

参考连接:

http://blog.csdn.net/yang_lang/article/details/5926486

https://www.cnblogs.com/darling131499/p/4609097.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39683368/article/details/112989292

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签