Ruby下使用SWIG封装libcurl

本文通过在ruby下使用SWIG封装libcurl来简要描述如何通过SWIG来扩展ruby。
关于SWIG的入门使用可参见 使用SWIG扩展ruby性能

一、关于SWIG

SWIG全称为 Simplified Wrapper and Interface Generator,通过swig可以方便快捷的使用c/c++扩展php, ruby等语言以提高性能或满足其它用途。

二、关于libcurl

libcurl是一个著名的http/ftp库,通过libcurl可能轻松通过http/ftp协议访问网络。

三、流程

四、相关文件

1. SWIG的封装文件 curl.i

%module curl
%{
#include <curl/curl.h>;
%}

/* type definations */
typedef int CURLoption;
typedef int CURLcode;

/* import constants */
%constant int CURL_GLOBAL_ALL = CURL_GLOBAL_ALL;
%constant int CURLOPT_URL = CURLOPT_URL;

/* import functions */
int curl_global_init(long flags);
void curl_global_cleanup();

CURL* curl_easy_init();
void curl_easy_cleanup(CURL* curl);
CURLcode curl_easy_setopt(CURL* curl, CURLoption opt, int v);
CURLcode curl_easy_setopt(CURL* curl, CURLoption opt, const char* v);
CURLcode curl_easy_perform(CURL* curl);

2. ruby的extconf.rb文件

require 'mkmf'
%w{stdc++ curl}.each do|lib|
	$libs = append_library $libs, lib
end
create_makefile 'curl'

3. 编译build.sh

#通过curl.i生成封装后的cpp源码
swig -c++ -ruby curl.i &&

#通过extconf.rb生成Makefile
ruby extconf.rb &&

#通过Makefile生成目标扩展
make

4. 测式文件ruby_test.rb

#!/usr/bin/env ruby
require 'curl'
include Curl

url = ARGV[0] || 'http://www.google.com'

p curl_global_init(CURL_GLOBAL_ALL)
p curl =  curl_easy_init()
p curl_easy_setopt(curl, CURLOPT_URL, url)
p curl_easy_perform(curl)
p curl_easy_cleanup(curl)
p curl_global_cleanup()

本文相关的完整源码可在github下载: http://github.com/JiangMiao/ruby_swig_curl_demo
git clone git://github.com/JiangMiao/ruby_swig_curl_demo.git

五、相关链接

libcurl
SWIG

发表评论

电子邮件地址不会被公开。 必填项已用*标注