`
CharlesCui
  • 浏览: 427468 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Swig编译C/C++代码给Ruby [on Mac]

阅读更多
charlesdemacbook-pro:swig Cui$ gcc -shared -c example.c -c example_wrap.c -o example.so -I/Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/Ruby.framework/Versions/1.8/Headers 


-c参数必不可少,否则会默认编译成可执行文件,而且出错.

由于是从源码直接编译的,所以不需要ruby extconf.rb
如果用ruby extconf.rb生成makefile,再make,将会报错说找不到符号.

注意问题:
swig -ruby example.i
在example.i文件中,结构体的定义有如下要求:

%{
	typedef struct Vector
	{
	 double x, y;
	}Vector;
%}

typedef struct Vector
{
 double x, y;
}Vector;


还没看明白为何要在%{%}中定义一遍,然后又在外面定义一遍.

还可以这样做,用include

%module mymodule
%{
#include "vector.h"
%}

%include "vector.h"          // Just grab original C header file


C里面可以给结构体直接定义属性,但不能定义方法.
swig是在swig文件中解决的:

%extend Vector {             // Attach these functions to struct Vector
	Vector(double x, double y, double z) {
		Vector *v;
		v = (Vector *) malloc(sizeof(Vector));
		v->x = x;
		v->y = y;
		v->z = z;
		return v;
	}
	~Vector() {
		free($self);
	}
	double magnitude() {
		return sqrt($self->x*$self->x+$self->y*$self->y+$self->z*$self->z);
	}
	void print() {
		printf("Vector [%g, %g, %g]\n", $self->x,$self->y,$self->z);
	}
};


然后这么用:

>>> v = Vector(3,4,0)                 # Create a new vector
>>> print v.magnitude()                # Print magnitude
5.0
>>> v.print()                  # Print it out
[ 3, 4, 0 ]
>>> del v                      # Destroy it


还可以这么定义:

%module mymodule
%{
#include "vector.h"
%}

typedef struct {
	double x,y,z;
	%extend {
		Vector(double x, double y, double z) { ... }
		~Vector() { ... }
		...
	}
} Vector;


再来一个:

struct Person {
   char name[50];
   ...
}

看到没,Person是个结构体,也是一个类,但swig转换成so之后,不知道如何修改name这个属性,因为它是数组.要像下面这样做:

在swig文件中再添加点:

struct Person {
    %extend {
       char *name;
    }
...
}

// Specific implementation of set/get functions
%{
char *Person_name_get(Person *p) {
   return p->name;
}
void Person_name_set(Person *p, char *val) {
   strncpy(p->name,val,50);
}
%}


就可以Person.name=这样操作了.
从上面这两个增加的方法可以看到,类和实例方法在swig内部是通过命名规则来维护的,
比如Person_name_set,就是Person.name=,就是指Person类的name=方法.

都是我猜的,嘿嘿.

原来FX不是用Haskell给Ruby做DLL扩展么.
还有谁玩这个?一起玩?
分享到:
评论
4 楼 CharlesCui 2009-10-13  
femto 写道
不明白?什么意思?Ruby调c的库?
用ffi不就行了?


FFI让我很期待,不过等它版本号再高点,我再上手也不迟.
3 楼 femto 2009-10-13  
不明白?什么意思?Ruby调c的库?
用ffi不就行了?
2 楼 CharlesCui 2009-10-13  
ray_linn 写道
CharlesCui 写道
都是我猜的,嘿嘿.

原来FX不是用Haskell给Ruby做DLL扩展么.
还有谁玩这个?一起玩?



是night_stalker玩的,不是FX


对了,他俩发帖总是一唱一和的,弄混了.
1 楼 ray_linn 2009-10-12  
CharlesCui 写道
都是我猜的,嘿嘿.

原来FX不是用Haskell给Ruby做DLL扩展么.
还有谁玩这个?一起玩?



是night_stalker玩的,不是FX

相关推荐

    SWIG 源码(C/C++与其他语言的粘合剂)

    SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中也包括非脚本...

    SWIG Specification

    - 构建模块:将SWIG生成的包装器代码与原有C/C++代码一起编译链接,生成适用于目标语言的模块。 - 使用接口:在目标语言中加载生成的模块,调用C/C++函数或使用C/C++类。 SWIG对于支持C/C++语言特性也有一定的要求...

    swigwin-3.0.10.zip

    SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动封装成其他编程语言的接口,比如Python、Java、Perl、Tcl等。在本压缩包"swigwin-3.0.10.zip"中,包含的是SWIG的Windows...

    swig学习资料.doc

    SWIG(Simplified Wrapper and Interface Generator)是一种强大的工具,用于将 C 和 C++ 代码链接到各种高级编程语言。通过 SWIG,开发者能够轻松地创建与 C/C++ 库交互的脚本程序,极大地简化了跨语言编程的过程。...

    swig使用手册

    它通过自动生成必要的封装代码,使C/C++库能够被多种脚本语言调用,如Perl、Python、Ruby等,无需开发者手动编写繁琐的接口代码。 **2.1 SWIG是什么?** SWIG是一种自动化工具,用于构建C/C++库与各种脚本语言之间...

    swig-2.0.6.tar.gz_swig-2.0.1.tar.gz

    SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动绑定到多种脚本语言,如Python、Perl、Tcl、Java等。标题中的"swig-2.0.6.tar.gz_swig-2.0.1.tar.gz"表明这是两个不同...

    swig的学习以及国密的python封装.zip_python 国密_swig的学习以及国密的python封装_国密

    - 编译C/C++源码:使用SWIG生成的绑定代码和原始C/C++代码一起编译成动态链接库。 - 导入Python:在Python环境中,导入生成的模块,即可调用C/C++的函数。 4. **国密算法的Python封装**: - 分析C/C++实现:理解...

    SWIG是一种软件开发工具,可将用C和C++编写的程序与各种高级编程语言连接起来_C++_下载.zip

    SWIG的主要目标是简化接口的创建,使得C和C++库可以被Python、Perl、Ruby、Java、Tcl、JavaScript等脚本语言调用,甚至包括MATLAB和Octave这样的科学计算环境。通过使用SWIG,开发者可以充分利用现有C/C++库的性能...

    多语言粘合工具swig源代码

    SWIG通过解析C或C++头文件来识别函数、变量、类和其他编程元素,并为它们生成目标语言的绑定代码。它理解C++的特性,包括模板、命名空间、继承和异常处理,因此能处理复杂的C++库。 2. **SWIG的主要功能** - **...

    swig-3.0.7.tar.gz

    SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动绑定到多种脚本语言,如Python、Perl、Tcl、Java、Ruby等。它简化了创建这些语言的接口过程,使得C/C++库可以方便地在...

    swig4.1.1linux版+windows版

    SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动绑定到多种脚本语言,如Python、Perl、Ruby等。它简化了创建这些语言的接口的过程,使得C/C++库可以方便地在各种脚本...

    SWIG源码及工具

    3. **编译中间代码**:将生成的中间语言文件与你的C/C++源代码一起编译,形成动态链接库(DLL)或共享库。 4. **在目标语言中导入模块**:在Python等目标语言中,你可以导入生成的模块,然后像使用本地对象一样调用C...

    swig-2.0.10 .tar.gz

    SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码与多种高级语言(如Python、Perl、Java、Ruby等)连接起来。`swig-2.0.10.tar.gz` 是SWIG的一个版本,具体是2.0.10版的源码...

    SWIG v3.0.6.zip

    SWIG的核心功能在于它的接口描述语言(IDL),这是一种简单的文本格式,允许开发者定义哪些C/C++函数、类、结构和枚举类型需要暴露给目标编程语言。通过这种方式,SWIG可以自动处理内存管理、类型转换以及错误处理等...

    swigwin-1.3.40

    它的主要目标是简化过程,减少手动编写接口的工作量,同时提供了一种灵活的方式将现有C/C++代码集成到脚本环境中,如Tcl、Python、Perl、Ruby等。 **C语言与Tcl的结合** C语言以其高效和灵活性著称,常用于开发...

    swigwin-3.0.12

    SWIG是一个强大的源代码接口生成器,能够将C和C++库自动绑定到多种高级脚本语言,如Python、Perl、Tcl、Ruby等。通过使用SWIG,开发者可以轻松地在这些脚本语言中调用C/C++的函数和类,极大地扩展了C/C++代码的应用...

    cmake_c++_python_swig

    通过SWIG,开发者可以将现有的C++代码快速地包装成Python模块,无需手动编写复杂的Python-C接口代码。 **CMake与SWIG结合使用** 在CMake项目中整合SWIG,首先需要在`CMakeLists.txt`文件中添加对SWIG的支持,包括...

    swig-3.0.12.tar

    SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动封装成其他编程语言的接口,比如Python、Java、Perl、PHP等。SWIG 3.0.12是该工具的一个特定版本,它包含了对各种语言...

    SWIGDocumentation

    - **非侵入性接口构建**:SWIG的一个关键特性是它的非侵入性设计,这意味着它不需要对原始C/C++源代码进行修改就能生成接口代码。 - **自动化程度高**:SWIG能自动处理大部分常见的C/C++数据类型和结构,减少了手动...

    swig-2.0.12.tar.gz

    SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码与多种高级语言(如Python、Perl、Java、Ruby等)接口。在这个案例中,我们讨论的是SWIG的2.0.12版本,它是一个用于安装...

Global site tag (gtag.js) - Google Analytics