Shiboken 入门练习
晨曦之光 发布于 2012/05/08 10:15 阅读 741 收藏 0 评论 0NGINX 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