python通过swig调用静态库
swig - Simplified Wrapper and Interface Generator
swig可以支持python,go,php,lua,ruby,c#等多种语言的包裹
本文主要记录如何使用swig创建一个可供python中调用静态库接口
首先手上有一个头文件(.h)以及一个静态库文件(.a),这是常见的api分发方式
libcode.a code.h
看一下code.h中的内容:
int encode(const char* salt, int version, const char* from, string& to);
int decode(const char* salt, int version, const char* from, string& to);
可以知道包含了一个加密和一个解密的函数,我们这里只是用解密来举例
为了使用swig进行包裹,我们先创建一个自己的头文件和实现文件coding.cpp coding.h
看一下内容:
coding.cpp
#include "code.h"
using std::string;
const int version = 1;
string decode(int version, string salt, string from)
{
string to;
int ret = decode(salt.c_str(), version, from.c_str(), to);
if(ret != 0)
{
return "";
}
return to;
}
coding.h
#include <string>
std::string decode(int version, std::string salt, std::string from);
接下来我们定义我们的swig入口文件coding.i
%module coding
%include "std_string.i"
%{
#define SWIG_FILE_WITH_INIT
#include "coding.h"
%}
std::string decode(int version, std::string salt, std::string from);
注意这里由于使用了std::string,所以必须%include "std_string.i"
然后,我们使用swig来获取到包裹文件
swig -c++ -python coding.i
执行后会得到coding_wrap.cxx文件以及coding.py文件
接下来我们编译出几个目标文件:
g++ -O2 -fPIC -c coding.cpp
g++ -O2 -fPIC -c coding_wrap.cxx -I/usr/include/python2.7
得到coding.o和coding_wrap.o
然后链接得到动态库
g++ -lssl -shared coding.o coding_wrap.o libcode.a -o _coding.so
注意这边链接的时候使用了-lssl选项是因为加解密的静态库的实现中使用openssl
然后得到了_coding.so这个动态库
至此,我们所需要的两个文件_coding.so和coding.py就都已经拿到了,下面的python代码演示了如何使用
import coding
coding.decode(1, "xxxxx-salt-xxxxx", "xxxxxxxxxx-encoded-text-xxxxxxxxxxxx")
参考:
http://www.swig.org/Doc1.3/Python.html#Python_nn22
http://www.swig.org/Doc1.3/Library.html#Library_nn14
http://www.deep-nlp.com/?p=31
python通过swig调用静态库的更多相关文章
- # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库
使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉 懒得研究怎么解决兼容性的问题了,直接开一 ...
- VC调用静态库、动态库
静态库 // 相对路径 或者 绝对路径 #include "yourlib.h" //相对路径 或者 绝对路径 #pragma comment(lib, "yourlib ...
- Delphi XE10在 Android下调用静态库a文件
Delphi Seatle can link Delphi project with Static library files(*.a): 1.at Delphi IDE, Add the " ...
- 16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS
;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.as ...
- C、C++的Makefile的编写以及动、静态库的制作调用(包括MAC地址的获取及MD5加密)
一.C代码 静态库 四个.h.c文件 add.h #ifndef ADD_H #define ADD_H int add(int a,int b); #endif add.c #include < ...
- windows 创建和调用 动态库,静态库
windows创建和调用静态库 // MathFuncsLib.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b ...
- Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- 静态库介绍与简单演练及同名资源冲突解决(.a格式的静态库)
1.静态库和动态库都是闭源库,不公开源代码. 静态库:.a和.framework 动态库:.dylib和.framework(iOS9取消了.dylib,使用.tbd替代) 2.静态库和动态库在使用上 ...
随机推荐
- 2016-2017-20155329 《Java程序设计》第5周学习总结
学号 2016-2017-20155329 <Java程序设计>第5周学习总结 教材学习内容总结 Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生时显示友好的错误 ...
- 微服务深入浅出(1)-- SpringBoot
基于Spring的开发框架,旨在简化配置快速开发,是新一代web开发框架.下面介绍一下常用的几个功能: 1.Spring单元测试 针对DAO层 (1) @RunWith(Spring.class),表 ...
- 选择Memcached还是Redis?
两者相似之处 Memcached与Redis都属于内存内.键值数据存储方案.它们都从属于数据管理解决方案中的NoSQL家族,而且都基于同样的键值数据模型.双方都选择将全部数据保存在内存当中,这自然也就 ...
- 25、LinkedList特有方法
LinkedList特有方法 public void addFirst(E e)及addLast(E e) public E getFirst()及getLast() public E removeF ...
- 【译】第四篇 Integration Services:增量加载-Updating Rows
本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...
- js 语法简写积累
if (!a || !b || !c || !d){//} 简写为:if([a, b, c, d].map(Boolean).includes(false)){//};
- Struts2笔记3--获取ServletAPI和OGNL与值栈
获取ServletAPI: 第一种方式: //在request域中放入属性req,暂且认为getContext()获取的是request域空间,但实际不是 ActionContext.getConte ...
- VC++6.0中ClassView中类消失 解决方案[转自网络]
有时候在VC++6.0中编程会出现这样一个问题,由于对C...View类的操作后,在窗口左边ClassView框中的C...View类会消失,这种操作通常是在C...View类中右击点“Add Win ...
- openjudge-NOI 2.5基本算法之搜索 专题题解目录
1.1700 八皇后问题 2.1756 八皇后 3.1789 算24
- poj1067
题意:有两堆石子,两人轮流取,每次可以取一堆中的任意个,或两堆中取相同多个.谁先取光所有堆谁赢.问先手能否获胜. 分析:威佐夫博弈,如果是奇异态则先手输,否则先手赢.直接套用公式判断是否为奇异态,设第 ...