首页 > 编程语言 >CMAKE相对路径编译和python的ctypes引用

CMAKE相对路径编译和python的ctypes引用

时间:2023-09-14 15:24:42浏览次数:46  
标签:调用 CMAKE python so library 编译 相对路径 ctypes main

CMAKE相对路径编译和python的ctypes引用

cmake 编译库使用相对路径

cmake 编译使用相对路径生成动态库,进而满足其他代码的调用,如python的ctypes

由于ctypes能调用c,而不能调用c++,所以,使用extern c来处理,使ctypes能够调用。

  1. extern c
    在需要编译动态库cpp代码中,使用C的方式处理函数名yyy
extern c yyy

例如

extern "C" int main(int argc, char *argv[])
  1. 修改cmakelists,使用相对路径编译。

set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH $ORIGIN)

  1. 正常使用cmake 编译
cmake ..

4.检查extern C 是否生效

查看xxx.so动态库是否有yyy的函数

objdump -T xxx.so | grep  yyy 

如果查询到有yyy,表示可以使用ctypes调用。

python的ctypes调用so

# 导入ctypes
from ctypes import *
# 获取当前运行文件的路径
lib_dir=os.path.dirname(os.path.abspath(__file__))
# 设置so路径
path=os.path.join(lib_dir,'xxx/xxx.so')
# 加载动态库 so 文件
library = cdll.LoadLibrary(path)

# 构造参数
param=(c_char_p * 3)(b'./main',b'arg1',b'arg2')
# 注意 c_char_p 为后面传参的参数数量,如
# param=(c_char_p * 3)(b'./main',b'-o',b'123')
# 等效于在命令行  ./main -o 123


# 设置返回类型和传参类型
library.main.restype = c_int
library.main.argtype = c_int,POINTER(c_char_p)

ret = library.main(len(param),param)
# 如果如果library.main函数有多个数据返回,可以定义以结构体的数据进行返回。
class test_struct(Structure):
    _fields_ = [('a',c_int32),
        ('b',c_int32),
        ('c',c_int32),
        ('d',c_int32),
        ]
  
# 调用library.main执行
ret = library.main(len(param),param)

# 获取返回值,由于c的main函数一般是int类型,所以在cpp里开发了get_info,用来获取数据
# 调用动态库中的 so 文件中的 get_info 函数
library.get_info.restype = POINTER(test_struct)       # 设置返回值   
restruct = library.get_info()    # 调用并返回结构体,注意get_info 函数没有任何需要传的参数,所以未定义 argtype 


# 将调用的值放到python中
a = restruct.contents.a
b = restruct.contents.b
c = restruct.contents.c

标签:调用,CMAKE,python,so,library,编译,相对路径,ctypes,main
From: https://www.cnblogs.com/XUEYEYU/p/17702582.html

相关文章

  • 盘点6个应该掌握的Python内置函数!
    Python作为一种灵活而强大的编程语言,越来越多的工程师开始学习、使用它。今天给大家介绍6个常见的Python内置函数,希望大家能够掌握它,以下是详细的内容:1、len()函数len()命令是一种简单而不可或缺的机制,用于确定指定可迭代对象(如列表、元组或字符串)的大小(即组件的计......
  • python分片和断点续传oss
    分片上传和断点续传是常见于文件上传至云存储服务的操作,其中OSS(ObjectStorageService)是阿里云提供的云存储服务。Python可以用来实现分片上传和断点续传到阿里云OSS。下面是一个简单的示例,演示了如何使用Python和阿里云OSSSDK进行分片上传和断点续传。首先,确保你已......
  • python 根据asctime字符串转成日期
    1、将asctime转换为时间戳如果将asctime转换为日期时间字符串,首先需要将asctime转换为时间戳。时间戳是指自1970年1月1日以来的秒数。Python中的time模块提供了将asctime转换为时间戳的函数mktime。importtimeasctime="FriMay1405:24:592021"t=time.mktim......
  • MySQL 和 Python:无缝结合的数据库应用
    MySQL和Python都是广泛应用于软件开发的重要工具。MySQL是一种强大的关系型数据库管理系统,而Python则是一种灵活的高级编程语言。它们之间的紧密集成为开发人员提供了强大的数据存储和操作能力。本文将探讨MySQL和Python之间的关系,并提供一些示例代码来演示如何在Python......
  • cmake设置目标文件的绝对路径
    通常Linux问题不大,Windows下老是会出现Debug和Release目录,导致不一致这样设置即可set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG${CMAKE_CURRENT_SOURCE_DIR}/../bin)set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE${CMAKE_CURRENT_SOURCE_DIR}/../bin)上面的语句设置目标路......
  • 使用python进行数据同步,根据游标的方式
    使用python进行数据同步,根据游标的方式一、介绍:数据同步分为好几种,比如根据最大id排序,其次才是根据游标进行排序。为什么不使用最大id进行数据同步?如下:因为如果数据表中的数据是按照降序排序的,那么每次根据最大id取1000条数据的方式也是一种可行的分页查询方式。这种方式的优......
  • 使用pyinstaller和electron将python打包为桌面端应用,无法在win7上执行
    在win10或win11上开发的软件,直接在win7上运行,可能导致下面的问题(python3.11electron23.*)(python3.7electron23.*) 原因在于:win10或win11上的开发环境(如python版本,electron版本)过高,win7不支持该环境。解决办法:降低python版本和electron版本,如:win7支持的python3.7和electron1......
  • 使用pyinstaller打包python(anaconda虚拟环境),生成exe文件过大,改用pipenv创建虚拟环境
    pipenv创建虚拟环境时,创建的python环境必须和本机python版本一致。因为本机的python是anaconda默认的python3.11,所以需要先激活conda下的win7py的虚拟环境。接下来才能使用pipenv–python3.7创建python3.7虚拟环境。 激活虚拟环境pipenvshell 根据项目依赖环境下载相应......
  • 记录一个python多线程的错误写法
    直接先上错误代码:importmultiprocessingdeffirst_way():init=3defprocess_function(item):result=item*initreturnresultdata=[1,2,3,4,5,6,7,8,9,10]pool=multiprocessing.Pool(processes=4)#创建一个......
  • glob:Python中文件名的匹配
    前言既然在Pathlib库中提到了glob()函数,那么我们就专门用一篇内容讲解文件名的匹配。其实我们有专门的一个文件名匹配库就叫:glob。不过,glob库的API非常小,但是仅仅应用于文件名的匹配绰绰有余。只要是在实际的项目中需要过滤,或者匹配一组文件,都可以使用该库进行操作。通配符星......