序文: 私は C に非常に慣れていないので、明らかな何かが欠けている可能性がありますが、それが何であるかを理解しようとして何日も走り回っています...
Mac と PC の両方で動作し、libcurl を使用してファイルをダウンロードする Ruby C 拡張機能を作成しようとしています。
基本的に、このツールが行うことは、Ruby からファイルのリストを取得し、ファイルをダウンロードして、Ruby が指定した場所に配置することだけです。
Ruby 内から機能する拡張機能があり、Ruby とのインターフェイスとなる C 拡張機能をコンパイルしました。
基本的に、私のコードは次のようになります。
#include <string.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include "ruby.h"
VALUE Test = Qnil;
void Init_test();
VALUE download_file(VALUE self, VALUE from, VALUE to);
void Init_test()
{
Test = rb_define_class("Test", rb_cObject);
rb_define_method(Test, "download_file", download_file, 2);
}
VALUE download_file(VALUE self, VALUE from, VALUE to)
{
CURL *curl;
FILE *fp;
CURLcode res;
char *url = STR2CSTR(from);
char outfilename[FILENAME_MAX] = STR2CSTR(to);
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename,"wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
// curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(fp);
}
return 0;
}
私が問題を抱えているのは、libcurlを実際に機能させることです:
$ ruby test.rb
dyld: lazy symbol binding failed: Symbol not found: _curl_easy_init
Referenced from: /path/to/test.bundle
Expected in: flat namespace
dyld: Symbol not found: _curl_easy_init
Referenced from: /path/to/test.bundle
Expected in: flat namespace
Trace/BPT trap
Ruby を使用mkmfして、拡張機能の Makefile を作成しています。
require 'mkmf'
extension_name = 'test'
dir_config(extension_name)
create_makefile(extension_name)
拡張機能をコンパイルするときに Makefile がその Curl ファイルを見つけることができないと想定していますが、私は C/Ruby 拡張機能を初めて使用するため、その理由がわかりません。
これを実行するcurl-config --cflagsと、次のようになります。
$ curl-config --cflags
-I/usr/local/include
私のlibcurlインクルード/ライブラリファイルは次のとおりです。
/usr/local/include/curl/
/usr/local/lib/libcurl.dylib
私のセットアップ:
- Mac OS X 10.6.4
- ルビー 1.8.6-p420
- カール 7.21.7-DEV (i386-apple-darwin10.7.0) libcurl/7.21.7-DEV OpenSSL/0.9.8l zlib/1.2.3
どんな助けでも大歓迎です!
乾杯