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.ocoding_wrap.o

然后链接得到动态库

g++ -lssl -shared coding.o coding_wrap.o libcode.a -o _coding.so

注意这边链接的时候使用了-lssl选项是因为加解密的静态库的实现中使用openssl

然后得到了_coding.so这个动态库

至此,我们所需要的两个文件_coding.socoding.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调用静态库的更多相关文章

  1. # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库

    使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉 懒得研究怎么解决兼容性的问题了,直接开一 ...

  2. VC调用静态库、动态库

    静态库 // 相对路径 或者 绝对路径 #include "yourlib.h" //相对路径 或者 绝对路径 #pragma comment(lib, "yourlib ...

  3. Delphi XE10在 Android下调用静态库a文件

    Delphi Seatle can link Delphi project with Static library files(*.a): 1.at Delphi IDE, Add the " ...

  4. 16位汇编 多文件 intel汇编 编译器masm5.0 调用子程序库即静态库的自定义函数 WINDOWS

    ;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.as ...

  5. 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 < ...

  6. windows 创建和调用 动态库,静态库

    windows创建和调用静态库 // MathFuncsLib.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b ...

  7. Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

    系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...

  8. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  9. 静态库介绍与简单演练及同名资源冲突解决(.a格式的静态库)

    1.静态库和动态库都是闭源库,不公开源代码. 静态库:.a和.framework 动态库:.dylib和.framework(iOS9取消了.dylib,使用.tbd替代) 2.静态库和动态库在使用上 ...

随机推荐

  1. java保存json格式数据,保存字符串和读取字符串

    1.java保存json格式数据,保存字符串和读取字符串 import java.io.*; class RWJson { public void wiite(String s, String toS ...

  2. php的几个面试题

    1. mysql_num_fields() 返回结果集中字段的数目 如: $result = mysql_query("SELECT id,name,age FROM mydb.tb1 wh ...

  3. Vue学习看这篇就够

    Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的 ...

  4. oracle关键字作为字段名使用方法

    有时我们在定义字段名及别名时所用名与oracle关键字同名,这时该如何处理呢? 其实很简单,只要在此关键字加上"",如"group" SQL> DROP ...

  5. 【FCS NOI2018】福建省冬摸鱼笔记 day2

    第二天. 同学还是不带本子记笔记.dalao. 第二天:图论,讲师:@ExfJoe 全程划水,前面都讲水算法[虽然我可能已经忘记了]什么最短路,Tarjan,最小生成树,2SAT,差分约束啥的,我现在 ...

  6. C# Java 加密解密

    C# AES加密解密 public static string Encrypt(string key, string clearText) { byte[] clearBytes = Encoding ...

  7. KL散度(Kullback–Leibler divergence)

    KL散度是度量两个分布之间差异的函数.在各种变分方法中,都有它的身影. 转自:https://zhuanlan.zhihu.com/p/22464760 一维高斯分布的KL散度 多维高斯分布的KL散度 ...

  8. 建立ARM交叉编译环境 (arm-none-linux-gnueabi-gcc with EABI)【转】

    转自:http://lib.csdn.net/article/embeddeddevelopment/60172?knId=886 建立ARM交叉编译环境 (arm-none-linux-gnueab ...

  9. dorado 的学习位置、控件使用方法查找、示例演示地址

    dorado的学习位置: http://wiki.bsdn.org/display/dorado7/Project+Home dorado的控件使用方法查找: http://dorado7.bsdn. ...

  10. jQuery插件之ajaxFileUpload(异步上传图片并实时显示,并解决onchange后ajaxFileUpload失效问题)

    参考学习: 第一篇:http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 第二篇:http://www.jb51.net/a ...