SWIG实现C/C++与其他语言间的互相调用-----
来源:互联网 发布:此时无法下载淘宝app 编辑:程序博客网 时间:2024/06/05 01:54
使用SWIG实现C/C++与其他语言间的互相调用
使用SWIG实现C/C++与其他语言间的互相调用
SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。
SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中也包括非脚本编译语言,例如C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。
SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中也包括非脚本编译语言,例如C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。
为了运行速度,java, C#, ruby等语言可能会调用C/C++写的函数或者类,但直接写很麻烦,必须遵循各种语言订立的规范,以jni为例要导出一个函数给java用,你必须在函数定义前写上JNIEXPORT,对于那些早已存在的代码,这样就麻烦了,而且相同的代码如果要给ruby用,又得按照扩展Ruby的规定去重新定义这些函数。并且不能将C++定义的类直接拿来用
但SWIG能很方便,很自然的将C/C++代码转换给这些语言用。
要使用swig需要到www.swig.org去下载这个工具。
以ruby为例,讲讲用法。
首先下载ruby, 我的是1.8.5, 运行configure.bat生成Makefile文件,再用nmake命令生成config.h文件和需要的静态库
用vs2005新建一个动态库工程
//Test.h
class TestRuby
{
public:
TestRuby();
void print();
};
void testFun();
//Test.cpp
#include "test.h"
#include<iostream>
using namespace std;
TestRuby::TestRuby()
{
cout<<"Test::Test\n";
}
void TestRuby::print()
{
cout<<"hello swig\n";
}
void testFun()
{
cout<<"testFun\n";
}
//Test.i
%module test
%{
#include "test.h"
%}
%include "test.h"
注意include前的是%,昨天看成#,害得白忙了半天,汗
建立一个空白文件test_wrap.cxx
设置好环境变量,运行
swig –c++ -ruby test.i
(也可以在项目属性中的自定义生成步骤中定义这些命令,具体见MSDN)
这时会更新test_wrap.cxx文件
自动生成ruby调用C函数需要的一些东东
如:
SWIGEXPORT void Init_test(void) {
size_t i;
SWIG_InitRuntime();
mTest = rb_define_module("Test");
SWIG_InitializeModule(0);
for (i = 0; i < swig_module.size; i++) {
SWIG_define_class(swig_module.types[i]);
}
SWIG_RubyInitializeTrackings();
cTestRuby.klass = rb_define_class_under(mTest, "TestRuby", rb_cObject);
SWIG_TypeClientData(SWIGTYPE_p_TestRuby, (void *) &cTestRuby);
rb_define_alloc_func(cTestRuby.klass, _wrap_TestRuby_allocate);
rb_define_method(cTestRuby.klass, "initialize", VALUEFUNC(_wrap_new_TestRuby), -1);
rb_define_method(cTestRuby.klass, "print", VALUEFUNC(_wrap_TestRuby_print), -1);
cTestRuby.mark = 0;
cTestRuby.destroy = (void (*)(void *)) free_TestRuby;
cTestRuby.trackObjects = 0;
rb_define_module_function(mTest, "testFun", VALUEFUNC(_wrap_testFun), -1);
}
在附加包含目录中引入ruby.h所在的那个路径
在链接器中把需要的库附加进去,我这里链接的是msvcrt-ruby18.lib
编译,生成dll
写个ruby文件测试
require 'test'
t = Test::TestRuby.new()
t.print
Test.testFun
正确输出
Test::Test
Hello swig
testFun
如果要把这个代码给java,或C#用只要改变一下swig的命令参数,然后再编译一次就行了,异常方便
Swig不支持C++所以特性,但常用的特性都支持,不太影响使用。
Swig支持C#, java, Lua, Ruby, Perl, Python, Tcl等多种语言
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1714946
0 0
- 使用SWIG实现C/C++与其他语言间的互相调用
- 使用SWIG实现C/C++与其他语言间的互相调用 zz
- SWIG实现C/C++与其他语言间的互相调用-----
- Lisp与其他语言互相调用
- 利用swig实现python调用C/C++的方法
- 利用swig实现python调用C/C++的方法
- 利用swig实现python调用C/C++的方法
- Python中的for与其他类C语言的比较(如c++,c#)
- 采用SWIG实现python调用C函数
- 用Swig将c/c++程序转为java代码(使用swig实现java调用c、c++的方法)
- 黑马程序员------object-c简史及对比基本语法与其他语言的不同
- 黑马程序员——C语言中指针与其他数据类型的结合使用
- lua几个易与其他语言(特别C++)混淆的地方
- lua和c语言互相调用的例子
- TensorFlow中的SWIG实现Python调用C/C++代码
- C语言和AAuto互相调用函数
- lua与c语言互相调用
- c语言中的头文件互相调用
- [swift 1 ]The Swift Programming Language-欢迎使用Swift-Swift 初见
- Mybatis 数据库表增删改查
- 解决git Push时请求username和password,而不是ssh-key验证
- Unity项目内各种文件的作用
- 二叉树四种遍历(递归)
- SWIG实现C/C++与其他语言间的互相调用-----
- LeetCode36:Valid Sudoku
- 创建Android启动界面
- int 与char数组之间的转换
- 好工作?工作快乐么?再温《HP大中华区总裁孙振耀退休感言》(续)
- sql注入攻击(三)sql注入解决办法
- 12胜者树和败者树
- 微信支付的常见问题,invalide code
- android 计算所在周所在月的前后日期