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扩展么.
还有谁玩这个?一起玩?
分享到:
- 2009-10-12 15:01
- 浏览 2126
- 评论(4)
- 论坛回复 / 浏览 (4 / 2815)
- 查看更多
相关推荐
SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中也包括非脚本...
- 构建模块:将SWIG生成的包装器代码与原有C/C++代码一起编译链接,生成适用于目标语言的模块。 - 使用接口:在目标语言中加载生成的模块,调用C/C++函数或使用C/C++类。 SWIG对于支持C/C++语言特性也有一定的要求...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动封装成其他编程语言的接口,比如Python、Java、Perl、Tcl等。在本压缩包"swigwin-3.0.10.zip"中,包含的是SWIG的Windows...
SWIG(Simplified Wrapper and Interface Generator)是一种强大的工具,用于将 C 和 C++ 代码链接到各种高级编程语言。通过 SWIG,开发者能够轻松地创建与 C/C++ 库交互的脚本程序,极大地简化了跨语言编程的过程。...
它通过自动生成必要的封装代码,使C/C++库能够被多种脚本语言调用,如Perl、Python、Ruby等,无需开发者手动编写繁琐的接口代码。 **2.1 SWIG是什么?** SWIG是一种自动化工具,用于构建C/C++库与各种脚本语言之间...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动绑定到多种脚本语言,如Python、Perl、Tcl、Java等。标题中的"swig-2.0.6.tar.gz_swig-2.0.1.tar.gz"表明这是两个不同...
- 编译C/C++源码:使用SWIG生成的绑定代码和原始C/C++代码一起编译成动态链接库。 - 导入Python:在Python环境中,导入生成的模块,即可调用C/C++的函数。 4. **国密算法的Python封装**: - 分析C/C++实现:理解...
SWIG的主要目标是简化接口的创建,使得C和C++库可以被Python、Perl、Ruby、Java、Tcl、JavaScript等脚本语言调用,甚至包括MATLAB和Octave这样的科学计算环境。通过使用SWIG,开发者可以充分利用现有C/C++库的性能...
SWIG通过解析C或C++头文件来识别函数、变量、类和其他编程元素,并为它们生成目标语言的绑定代码。它理解C++的特性,包括模板、命名空间、继承和异常处理,因此能处理复杂的C++库。 2. **SWIG的主要功能** - **...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动绑定到多种脚本语言,如Python、Perl、Tcl、Java、Ruby等。它简化了创建这些语言的接口过程,使得C/C++库可以方便地在...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动绑定到多种脚本语言,如Python、Perl、Ruby等。它简化了创建这些语言的接口的过程,使得C/C++库可以方便地在各种脚本...
3. **编译中间代码**:将生成的中间语言文件与你的C/C++源代码一起编译,形成动态链接库(DLL)或共享库。 4. **在目标语言中导入模块**:在Python等目标语言中,你可以导入生成的模块,然后像使用本地对象一样调用C...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码与多种高级语言(如Python、Perl、Java、Ruby等)连接起来。`swig-2.0.10.tar.gz` 是SWIG的一个版本,具体是2.0.10版的源码...
SWIG的核心功能在于它的接口描述语言(IDL),这是一种简单的文本格式,允许开发者定义哪些C/C++函数、类、结构和枚举类型需要暴露给目标编程语言。通过这种方式,SWIG可以自动处理内存管理、类型转换以及错误处理等...
它的主要目标是简化过程,减少手动编写接口的工作量,同时提供了一种灵活的方式将现有C/C++代码集成到脚本环境中,如Tcl、Python、Perl、Ruby等。 **C语言与Tcl的结合** C语言以其高效和灵活性著称,常用于开发...
SWIG是一个强大的源代码接口生成器,能够将C和C++库自动绑定到多种高级脚本语言,如Python、Perl、Tcl、Ruby等。通过使用SWIG,开发者可以轻松地在这些脚本语言中调用C/C++的函数和类,极大地扩展了C/C++代码的应用...
通过SWIG,开发者可以将现有的C++代码快速地包装成Python模块,无需手动编写复杂的Python-C接口代码。 **CMake与SWIG结合使用** 在CMake项目中整合SWIG,首先需要在`CMakeLists.txt`文件中添加对SWIG的支持,包括...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码自动封装成其他编程语言的接口,比如Python、Java、Perl、PHP等。SWIG 3.0.12是该工具的一个特定版本,它包含了对各种语言...
- **非侵入性接口构建**:SWIG的一个关键特性是它的非侵入性设计,这意味着它不需要对原始C/C++源代码进行修改就能生成接口代码。 - **自动化程度高**:SWIG能自动处理大部分常见的C/C++数据类型和结构,减少了手动...
SWIG(Simplified Wrapper and Interface Generator)是一款强大的工具,用于将C和C++代码与多种高级语言(如Python、Perl、Java、Ruby等)接口。在这个案例中,我们讨论的是SWIG的2.0.12版本,它是一个用于安装...