首页 > 其他分享 >Shiboken 入门练习

Shiboken 入门练习

时间:2022-11-23 11:27:03浏览次数:64  
标签:入门 lib -- 练习 wrapper Shiboken shiboken cpp foo

Shiboken 入门练习

晨曦之光 发布于 2012/05/08 10:15   阅读 741    收藏 0    评论 0

NGINX Sprint China 2022--NGINX 年度旗舰盛会,已开启免费预约!>>> 

 

终于弄清楚 shiboken 怎么用了,可是距离学习使用 Python 调用 C 模块 已经过了 10 个月时间。

不管怎样,第一个例子,还是需要完整记录一下,备忘。

(注意:本文只是 windows 下使用 shiboken 的一个尝试,正常使用参考:使用 Shiboken 为 C++ 和 Qt 库创建 Python 绑定 )

生成 C++ 动态库

写个很简单的类:

+-- libfoo/
|      |-- foo.h
|      |-- foo.cpp
|      `-- foo.pro
  • foo.h 内容如下:
#ifndef FOO_H
#define FOO_H

#if defined _WIN32
    #if LIBFOO_BUILD
        #define LIBFOO_API __declspec(dllexport)
    #else
        #define LIBFOO_API __declspec(dllimport)
    #endif
#else
    #define LIBFOO_API
#endif

class LIBFOO_API Math
{
public:
    Math(){}
    ~Math(){}
    int squared(int x);
};

#endif // FOO_H
  • foo.cpp 内容如下:
#include "foo.h"

int Math::squared(int x)
{
    return x * x;
}
  • 使用 qmake 来管理工程,对应的 foo.pro 如下
TEMPLATE = lib
TARGET = foo
HEADERS += foo.h
SOURCES += foo.cpp

DEFINES += LIBFOO_BUILD

运行 qmake 和 nmake 生成 foo.lib 和 foo.dll

生成胶水文件

需要准备的文件:

+-- foobinding/
|      |-- global.h
|      `-- typesystem_foo.xml
  • global.h 包含要提取的接口的头文件
#include "foo.h"
  • typesystem_foo.xml 包含要提取的信息
<?xml version="1.0"?>
<typesystem package="foo">
    <primitive-type name="int"/>
    <value-type name='Math'/>
</typesystem>

包的名字取为 foo,要导出的类为 Math,类中用到了 int 这一个基本类型。

  • 然后在该目录下运行 shiboken (生成胶水代码):
shiboken global.h --include-paths=../libfoo typesystem_foo.xml --output-directory=.

由于我们的 foo.h 不在该目录下,故需要指定其所在目录 (--include-paths)。

在当前目录下,最终将生成以下文件:

  • foo/foo_python.h
  • foo/foo_module_wrapper.cpp
  • foo/math_wrapper.h
  • foo/math_wrapper.cpp

胶水代码生成以后,我们就可以调用编译器进行编译:

编译胶水文件

+-- libfoo/
|      |-- foo.h
|      |-- foo.cpp
|      |-- foo.pro
|      |-- foo.dll
|      `-- foo.lib       
|
+-- foobinding/
|      |-- global.h
|      |-- typesystem_foo.xml
|      |
|      +---foo/
|            |-- foo_python.h 
|            |-- foo_module_wrapper.cpp
|            |-- math_wrapper.h
|            `-- math_wrapper.cpp

首先看看编译这几个胶水文件需要哪些东西:

 

头文件路径

库文件

python

 

python27.lib

shiboken

 

shiboken-python2.lib

foo

 

foo.lib

直接调用 MSVC 的编译器进行编译:

cl /EHsc /LD foo/foo_module_wrapper.cpp foo/math_wrapper.cpp /ID:/python27/include /ID:/shiboken/dist/include/shiboken /I../libfoo /Fefoo.pyd  /link /LIBPATH:D:/python27/libs /LIBPATH:D:/shiboken/dist/lib /LIBPATH:../libfoo/release shiboken-python2.7.lib python27.lib foo.lib

生成 foo.pyd

测试

编译一个 Python 程序测试看看:

# -*- coding: utf-8 -*-

import unittest
import foo

class MathTest(unittest.TestCase):
    def testMath(self):
        '''Test case for Math class from foo module.'''
        val = 5
        math = foo.Math()
        self.assertEqual(math.squared(5), 5 * 5)
 
if __name__ == '__main__':
    unittest.main()

恩一切正常。

至此,已经全手动的过了一遍,如果要自动化,看来还是要继续好好学习 cmake 才行。

顺便抱怨一下,PySide 的 shiboken 和 PyQt4 的 sip 相比,易用性还是远远不够

参考

 

标签:入门,lib,--,练习,wrapper,Shiboken,shiboken,cpp,foo
From: https://www.cnblogs.com/zxdplay/p/16917646.html

相关文章

  • 无人驾驶入门(雷达、定位和高精地图)
    【声明:版权所有,欢迎转载,请勿用于商业用途。   在无人驾驶中,除了camera,其他的传感器也十分重要,这其中就包括了雷达、定位和高清地图。雷达的主要工作是检测车辆周围的......
  • 第2-4-2章 规则引擎Drools入门案例-业务规则管理系统-组件化-中台
    目录3.Drools入门案例3.1业务场景说明3.2开发实现3.3小结3.3.1规则引擎构成3.3.2相关概念说明3.3.3规则引擎执行过程3.3.4KIE介绍3.Drools入门案例全套代码及资......
  • go语言入门
    go目录简介/bin:包含可执行文件,如:编译器,Go工具/doc:包含文档模版/lib:包含示例程序,代码工具,本地文档等/misc:包含与支持Go编辑器有关的配置文件以及cgo的示例/os_a......
  • CSS注册页面练习
    样式      展示      ......
  • 【JAVA笔记】jJAVA入门基础02
     一.符号及类型1.1添加注释comment注释:就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须要的,它不影响程序的编译和运行......
  • Vue入门
    1安装node.js下载地址:https://nodejs.org/en/download/2配置环境变量  1 在用户变量中点击“新建”,变量名输入NODE_PATH,变量值输入nodejs安装地址:D:\softpath\no......
  • #yyds干货盘点# LeetCode 腾讯精选练习 50 题:删除链表中的节点
    题目:有一个单链表的 head,我们想删除它其中的一个节点 node。给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。链表的所有值都是唯一的,并且保证给定......
  • TSMaster快速入门篇(2)-报文回放
    支持格式TSMaster的数据回放默认支持blf格式(未来会增加对其他格式的支持)。如果需要分析其他数据格式的log文件,需要通过文件转换器从其他格式转成blf格式。一、离线回......
  • 一文带你学懂LAMP架构--从概念入门到实战精通,还等什么,快来学习!!
    (服务阶段)1.服务相关概念简析,学习不迷路1.1web服务概述WEB服务器也称为WWW(WORLDWIDEWEB,万维⽹)服务器,主要功能是提供⽹上信息浏览服务。常见的web服务器:httpd(apache),nginx+......
  • 1、5分钟带你入门vuex(vuex状态管理)
    如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那么接......