想要快一点的方法吗,使用swig吧。

比如:

原生CTP Python API及Demo(利用Swig 封装)Windows版(traderapi)
https://blog.csdn.net/pjjing/article/details/77338423

CTP JAVA API(JCTP)编译(利用Swig封装C++动态库)windows版
https://blog.csdn.net/pjjing/article/details/53186394

c#利用SWIG调用c++dll学习总结
https://blog.csdn.net/liu14lang/article/details/78882539

假设你有一些c你想再加入Tcl, Perl, Python, Java and C#.。举例来说有这么一个文件example.c

/* File : example.c */

#include <time.h>

double My_variable = 3.0;

int fact(int n) {

 if (n <= 1) return 1;else return n*fact(n-1);

}

int my_mod(int x, int y) {

 return (x%y);

}

char *get_time()

{

 time_t ltime;time(&ltime);return ctime(&ltime);

}

接口文件

现在,为了增加这些文件到你喜欢的语言中,你需要写一个接口文件(interface file)投入到swig中。这些C functions的接口文件可能如下所示:

/* example.i */

%module example

%{

/* Put header files here or function declarations like below */

extern double My_variable;

extern int fact(int n);

extern int my_mod(int x, int y);

extern char *get_time();

%}

extern double My_variable;

extern int fact(int n);

extern int my_mod(int x, int y);

extern char *get_time();

建立Tcl模块

在UNIX系统提示,键入以下信息(LINUX系统请见SWIG WIKI共享库页面其他操作系统帮助):

unix % swig -tcl example.i

unix % gcc -fpic -c example.c example_wrap.c \

    -I/usr/local/include

unix % gcc -shared example.o example_wrap.o -o example.so

unix % tclsh

% load ./example.so example

% puts $My_variable

3.0

% fact 5

120

% my_mod 7 3

1

% get_time

Sun Feb 11 23:01:07 1996

%

该SWIG命令创建了一个文件example_wrap.c ,编辑并且和其余的程序联接。在这情况下,我们必须创建一个动态可装载的链接。能够装载进入TCL使用LOAD命令。
建立Python模块

转换编码C成Python模块很简单,只需要按如下做即可(请见其他操作系统的SWIG共享库帮助手册):

unix % swig -python example.i

unix % gcc -c example.c example_wrap.c \

    -I/usr/local/include/python2.1

unix % ld -shared example.o example_wrap.o -o _example.so

我们现在可以使用如下Python模块 :

import example

example.fact(5)

120

example.my_mod(7,3)

1

example.get_time()

‘Sun Feb 11 23:01:07 1996’

建立Perl模块

你可以建立如下的Perl模块,如Solaris(请见其他操作系统的SWIG共享库帮助手册):

unix % swig -perl5 example.i

unix % gcc -c example.c example_wrap.c \

    `perl -MExtUtils::Embed -e ccopts`

unix % ld -G example.o example_wrap.o -o example.so

unix % perl

use example;

print $example::My_variable,"\n";

print example::fact(5),"\n";

print example::get_time(),"\n";

3.0

120

Sun Feb 11 23:01:07 1996

unix %

建立Java模块

SWIG也会产生JNI代码以便Jave代码进入C/CC++。以下是建立一个Jave模块的事例(cygwin ,见其他操作系统的swig维基共享库页帮助):

$ swig -java example.i

$ gcc -c example.c example_wrap.c -I/c/jdk1.3.1/include -I/c/jdk1.3.1/include/win32

$ gcc -shared example.o example_wrap.o -mno-cygwin -Wl,–add-stdcall-alias -o example.dll

$ cat main.java

public class main {

public static void main(String argv[]) {

 System.loadLibrary("example");System.out.println(example.getMy_variable());System.out.println(example.fact(5));System.out.println(example.get_time());

}

}

$ javac main.java

$ java main

3.0

120

Mon Mar 4 18:20:31 2002

$

建立C#模块

SWIG也会产生代码以便C#使用Pinvoke进入C/CC++。以下是如何建立C#模块事例。cygwin ,见其他操作系统的swig维基共享库页帮助。使用了开源DotGNU Portable.NET能够在大多数Unix系统上运行,和其他C# compilers一样方便使用:

$ swig -csharp example.i

$ gcc -c -fpic example.c example_wrap.c

$ gcc -shared example.o example_wrap.o -o libexample.so

$ cscc -o runme *.cs

$ cat runme.cs

using System;

public class runme {

 static void Main() {Console.WriteLine(example.My_variable);Console.WriteLine(example.fact(5));Console.WriteLine(example.get_time());}

}

$ ilrun runme

3

120

Tue May 13 10:45:45 2003

$

SWIG 懒人方法

如上所见,并非总是需要写一个专门的接口文件。如果你有一个头文件,你可以直接在其中包含SWIG接口,如例:

%module example

%{

/* Includes the header in the wrapper code */

#include “header.h”

%}

/* Parse the header file to generate wrappers */

%include “header.h”

另外,有些人可能只包括SWIG条件指令在头文件中。例如:

#ifdef SWIG

%module example

%{

#include “header.h”

%}

#endif

extern int fact(int n);

Microsoft Windows下运行SWIG

SWIG能够运行在所有已知的32位版本的WINDOWS下95/98/NT/2000/XP。SWIG通常使用命令提示符因此能够使用NMAKE。模块通常由DLL编译,可动态加载入Tcl, Python,或者任何你使用的语言。只需要小小加工,SWIG就能够在MS下发挥巨大作用。
That’s it (well, more or less)

在开始前,你需要知道的事情。这里是简短的清单:

明确模块名称
使用 ANSI C/C++
理解如何编写一个共享模块/动态连接库(可能需要阅读一些所使用的编译器的帮助文件)
放松

Surely there’s more to it…

上述例子都很简单,但是大体思路已经延伸到复杂的C/C++。事实上,重要的是明白SWIG一个完整的C++支持下几乎能包含所有语言的特征。这些包括预处理,指针,类,甚至C++模块。SWIG能够在特定语言打包结构和类变成PROXY。

为了说明这一点,假设你想要封装以下C++数据结构:

// pair.h. A pair like the STL

namespace std {

template<class T1, class T2> struct pair {T1 first;T2 second;pair() : first(T1()), second(T2()) { };pair(const T1 &f, const T2 &s) : first(f), second(s) { }};

}

为了封装SWIG你需要如下接口:

// pair.i - SWIG interface

%module pair

%{

#include “pair.h”

%}

// Ignore the default constructor

%ignore std::pair::pair();

// Parse the original header file

%include “pair.h”

// Instantiate some templates

%template(pairii) std::pair<int,int>;

%template(pairdi) std::pair<double,int>;

接下去是编译(Python):

$ swig -python -c++ pair.i

$ c++ -c pair_wrap.c -I/usr/local/include/python2.1

$ c++ -shared pair_wrap.o -o _pair.so

$ python

Python 2.1 (#3, Aug 20 2001, 15:41:42)

[GCC 2.95.2 19991024 (release)] on sunos5

Type “copyright”, “credits” or “license” for more information.

import pair

a = pair.pairii(3,4)

a.first

3

a.second

4

a.second = 16

a.second

16

b = pair.pairdi(3.5,8)

b.first

3.5

b.second

8

swig: c与其它语言接口文件相关推荐

  1. vhdl文件添加c语言头文件,C语言对VHDL设计文件的协同仿真 - 基于Modelsim FLI接口的协同仿真技术...

    4 C语言对VHDL设计文件的协同仿真 4.1 构成框图 仿真文件的构成如图3所示,包括HDL文件和动态链接库(即c程序).图中c程序对应的VHDL文件要负责声明对应的动态链接库文件名及初始化函数,另 ...

  2. python c语言接口_C/C++ 提供 Python 接口

    C/C++ 和 Python 之间的交互 Tensorflow 的核心代码是 C 和 C++ 实现然后提供 Python 的接口,使用者无需关心 C++ 的细节,直接使用 Python 就能调用相关功 ...

  3. c++文件读取空格_程序员术与道:术—C语言对文件进行处理,文件处理的基本操作...

    各种编程语言都实现了文件的基本操作,提供了对应的接口,本篇文章先为你介绍C语言对文件进行处理和文件处理的基本操作.主要从以下几个方面进行介绍: 读取文件 写入文件 重命名文件 读取目录 读取目录下的文 ...

  4. linux c 判断文件打开文件,Linux 用C语言判断文件和文件夹

    Linux 用C语言判断文件和文件夹 #include #include #include #include int access(const char *pathname, int mode); i ...

  5. C语言头文件深入理解

    C语言程序中,源文件通常分为两种:一种用于保存程序的声明(declaration),称为头文件:另一种用于保存程序的实现(implementation),称为定义(definition)文件. C程序 ...

  6. c读取ini配置文件_Go-INI - 超赞的Go语言INI文件操作库

    INI 文件(Initialization File)是十分常用的配置文件格式,其由节(section).键(key)和值(value)组成,编写方便,表达性强,并能实现基本的配置分组功能,被各类软件 ...

  7. C语言接口的封装和设计专题

    C语言接口的封装和设计专题 Win32环境下动态链接库(DLL)编程原理 导出和导入函数的匹配 与DLL模块建立链接 使用符号名链接与标识号链接 编写DllMain函数 模块句柄 应用程序怎样找到DL ...

  8. C语言头文件 “ 细节 ”

    很多事不深入以为自己懂了,但真正用到项目上,才发现了问题.曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的.(毕竟刚毕业时老大对我最初的训练就是 ...

  9. postgresql c语言,任意语言访问PostgreSQL:C语言接口

    开源软件的一个好处是可以根据需要修改程序代码.如果程序后台使用PostgreSQL数据库,可以很容易用各种语言对其进行访问.本文作为系列文章的第一篇,会陆续介绍C.C++.PHP.Tcl.Python ...

  10. C语言之文件读写探究(四):fwrite、fread(一次读写一块数据(二进制操作))

    相关博文:C语言之文件读写探究(一):fopen.fclose(文件的打开和关闭) 相关博文:C语言之文件读写探究(二):fputc.fgetc.feof(一次读写一个字符(文本操作)) 相关博文:C ...

最新文章

  1. 毫米波雷达、ADAS中的应用以及毫米波雷达的检测、测距、测速和角度测量
  2. 日记 [2008年03月26日]
  3. [HDU 1254] 推箱子
  4. caffe源码分析:blob.hpp分析
  5. 案例集锦|科技赋能,华为云GaussDB助千行百业数字化转型
  6. mysql多线程复制binlog_MySQL并发复制系列一:binlog组提交 (转载)
  7. getCacheDir()和getFilesDir()方法区别
  8. java+yeild+sleep_java之yield(),sleep(),wait()区别详解-备忘笔记[转]
  9. 雷电模拟器7抓包安装证书
  10. python绘图技巧(高清图)
  11. Excel怎么设置单元格的边框
  12. 计算机二级电子表格开根号函数,excel公式中开根号是哪一个函数-excel开根公式,excel的根号计算公式...
  13. Flutter Connection to **** was not upgraded to websocket
  14. ps设计制作出可爱的浅蓝色雨滴下落GIF(3)
  15. 统一网络存储NAS+SAN=FAS
  16. 74HC595级联电路编程篇(四)
  17. 从零到一黑苹果教程(10.15Catalina)
  18. Unity(一)入门:Unity Hub下载 Unity安装
  19. 做亚马逊的工作,到底辛不辛苦?值得吗?
  20. SI 539 网站开发(二):week6

热门文章

  1. Linux硬件硬盘分区知识-总结
  2. 【面试必备】CSS盒模型的点点滴滴
  3. 日志分析工具Awstats实战之Nginx篇-分析结果静态化
  4. 深入理解JavaScript系列(13):This? Yes,this!
  5. VB中对AutoCAD对象图形文件操作
  6. Flink状态专题:keyed state和Operator state
  7. Asp.net mvc 集成Autofac和FluentValidation
  8. spl_autoload_register 和 __autoload()魔术方法
  9. Excel文件输出到浏览器
  10. thinkphp 文件下载实例 实现以及注意事项