1

序文: 私は 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

どんな助けでも大歓迎です!

乾杯

4

2 に答える 2

1

拡張機能をビルドするときに、mkmf に libcurl にリンクするように指示する必要があります。使用するコマンドはhave_library.

exconf.rbに、追加します

have_library("curl", "curl_easy_init")

への呼び出しの前にcreate_makefile

dir_config(extension_name)また、ラインは必要ないと思います。

(Mac では、どのライブラリがバイナリにリンクされているかを で確認できますotool -L

otool -L test.bundle

を追加する前後に、追加されたhave_libraryような行が表示されるはずです/usr/lib/libcurl.4.dylib (compatibility version 6.0.0, current version 6.1.0)。)

于 2011-06-07T03:05:48.867 に答える
1

Symbol not found: _curl_easy_init私にはリンクエラーのように聞こえます。いくつかのフラグをリンカーに渡す必要があるようです (「参考文献」を参照curl-config --libs) 。

于 2011-06-06T23:05:32.533 に答える