ubuntu中python调用C/C++方法之动态链接库详解

作者:Uncle_Orange 时间:2023-09-07 19:15:55 

安 * oost

python调用C/C++的方法有很多,本文使用boost.python。考虑到后期有好多在boost上的开发工作,所以boost一并安装了,Boost库分为两个部分来使用,一是直接使用对应的头文件,二是需要编译安装相应的库才可以使用。

具体安装方法可以参考:https://www.jb51.net/article/150380.htm

这里使用:


sudo apt-get install libboost-all-dev

服务端

序列化后发送

main.cpp:


#include <iostream>
#include "libUO.h"

int main()
{
UO_C_Socket t;
// t.StartSocketServer("",4121);
boost::thread t1(boost::bind(&UO_C_Socket::StartSocketServer,&t,"",4121));
sleep(2);
// boost::thread t2(boost::bind(&UO_C_Socket::StartSocketClient,&t,"127.0.0.1",4121));

// t2.join();
t1.join();
return 0;
}

客户端

客户端在UO_BaseFun.h里实现基本功能,将其进行封装并通过boost_python导出。特别注意,这里BOOST_PYTHON_MODULE中的名字需和最后make出的so文件

同名,不然会出现错误,错误名字忘记了

UO_libdll_py_wrap.cpp:


#include <boost/python.hpp>
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include "UO_BaseFun.h"

BOOST_PYTHON_MODULE(UO_BaseFun) //python模块
{
// boost::python::class_<UO_C_Socket,boost::noncopyable>("UO_C_Socket")
boost::python::class_<UO_C_Socket>("UO_C_Socket")
.def("StartSocketClient",&UO_C_Socket::StartSocketClient)
// .def("getname",&student::getname)
// .def("setage",&student::setage)
// .def("getage",&student::getage)
// .add_property("name",&student::getname,&student::setname)
// .add_property("age",&student::getage,&student::setage)
;
}

特别注意的是makefile中编译和连接的区别,其中出现的未定义符号错误需加上动态链接库-lboost_filesystem等。出现找不到pyconfig.h错误需包含

-I/usr/include/python2.7。make完了之后生成UO_BaseFun.so文件

makefile:


UO_BaseFun.so:UO_libdll_py_wrap.o
g++ UO_libdll_py_wrap.o -o UO_BaseFun.so -shared -fPIC -L/usr/lib/x86_64-linux-gnu\
-lboost_filesystem -lboost_thread -lboost_serialization -lboost_python -lboost_system

UO_STR.o:
g++ -c UO_STR.h -o UO_STR.o -I/usr/include/boost \
# -lboost_serialization

UO_BaseFun.o:UO_STR.o
g++ -c UO_BaseFun.h -o UO_BaseFun.o -I/usr/include/boost \
# -lboost_system -lboost_filesystem -lboost_thread -lboost_serialization

UO_libdll_py_wrap.o:UO_BaseFun.o
g++ -c UO_libdll_py_wrap.cpp -o UO_libdll_py_wrap.o -fPIC -I/usr/include/python2.7
# -lboost_serialization

clean:
rm -rf UO_STR.o O_libdll_py_wrap.o UO_BaseFun.o
rm -rf UO_BaseFun.so

验证

UO_StoreSystem_py.py:


import UO_BaseFun
test = UO_BaseFun.UO_C_Socket()
test.StartSocketClient("127.0.0.1",4121)

来源:https://blog.csdn.net/qq_36323886/article/details/70187817

标签:python,调用,动态链接库
0
投稿

猜你喜欢

  • PHP原型模式Prototype Pattern的使用介绍

    2023-05-25 01:21:04
  • Python查看Tensor尺寸及查看数据类型的实现

    2023-06-06 15:24:54
  • Java中@Pattern注解常用的校验正则表达式学习笔记

    2022-08-07 11:12:10
  • python识别验证码的思路及解决方案

    2022-02-02 16:05:13
  • Python读取mat文件,并转为csv文件的实例

    2023-01-01 11:03:54
  • Python基于argparse与ConfigParser库进行入参解析与ini parser

    2022-09-16 01:56:39
  • 使用基于Python的Tornado框架的HTTP客户端的教程

    2023-05-15 06:50:43
  • 解决Python print输出不换行没空格的问题

    2021-03-21 11:05:57
  • Python使用re模块正则提取字符串中括号内的内容示例

    2022-06-15 14:20:04
  • vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例

    2023-07-02 16:28:28
  • Python如何求取逆序数

    2022-07-16 07:16:57
  • Python实战使用Selenium爬取网页数据

    2021-06-18 19:11:56
  • python-yml文件读写与xml文件读写

    2022-06-16 06:43:50
  • 商品评论的设计

    2009-12-23 13:06:00
  • MySQL数据库执行Update卡死问题的解决方法

    2024-01-15 16:06:50
  • 用非动态SQL Server SQL语句来对动态查询进行执行

    2024-01-19 08:55:05
  • 网页栅格系统研究(3):粒度问题

    2008-10-28 19:46:00
  • ThinkPHP基于think-queue的队列插件实现消息推送

    2023-05-25 05:59:12
  • python包相关知识点之包的导入、相对路径以及绝对路径

    2023-08-11 11:09:46
  • js+css实现select的美化效果

    2024-04-16 09:52:25
  • asp之家 网络编程 m.aspxhome.com