問題タブ [ruby-c-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1549 参照

ruby - ruby gemの「resources」ディレクトリ

現在、Ruby で独自の gem を作成する実験を行っています。gem にはいくつかの静的リソース (ICO 形式のアイコンなど) が必要です。このようなリソースは、gem ディレクトリ ツリー内のどこに配置すればよいですか? また、コードからそれらにアクセスするにはどうすればよいですか?

また、私の拡張機能の一部はネイティブ C コードであり、C 部分もリソースにアクセスできるようにしたいと考えています。

0 投票する
1 に答える
1062 参照

ruby - ruby ですべてを rb_protect する方法

自作の C コードから ruby​​ コードを呼び出したい。例外が発生した場合に備えて、呼び出した ruby​​ コードを rb_protect する必要があります。rb_protect は次のようになります。

したがって、引数を取り、 を返すproc関数でなければなりません。そのようには機能しない多くの関数を呼び出さなければなりません。例外を発生させないようにするにはどうすればよいですか?VALUEVALUErb_protect

Data_Make_Structすべてを 1 つの Ruby オブジェクトにラップし、その上でメソッドを呼び出すために使用することを考えました。Data_Make_Structそれ自体が例外を発生させる可能性があります。どうすればいいrb_protect Data_Make_Structですか?

0 投票する
1 に答える
865 参照

c++ - C++ Ruby 拡張機能を作成できません

OSX で ruby​​ に記述した C++ ライブラリをエクスポートするための ruby​​ 拡張機能の作成に問題があります。この簡単な例:

bad_cast 例外がスローされます。

拡張機能を次のようにコンパイルします。

最後に、動的ライブラリを次のようにリンクします。

私は Web を検索し、あらゆる種類のリンクとコンパイラ スイッチを試しました。実行可能ファイルをビルドすると、そのような問題はありません。他の誰かがそのような問題を抱えていて、解決策を見つけましたか?

これをさらに調査したところ、例外の原因となっている関数は次のようになっていることがわかりました。

std::collat​​e<> のソースで、throw ステートメントを見つけました。

これはあなたにとって意味がありますか?

更新: Jan の提案を試しました:

バージョン:

アップデート:

スローするのは use_facet() の境界チェックではなく、実際に動的キャストを行う次の行です。この例は、RTTI を使用したものに要約します。

cout の使用も失敗するため、printf() を使用しました。上記のコードの出力は次のとおりです。

ビルド:

アップデート:

Init_bayeux の名前を main() に変更して実行可能ファイルにリンクすると、出力は同じになりますが、終了する呼び出しはありません。

アップデート:

共有ライブラリをロードして Init_bayeux() を実行する小さなプログラムを作成すると、例外はスローされません。

ruby.exe のビルド方法に問題があるように思えます。それは理にかなっていますか?

更新: 2 つの type_info オブジェクトの名前を含むアドレスを確認しました。内容は同じですが、アドレスが異なります。-flat_namespace スイッチをリンク コマンドに追加しました。これで dynamic_cast が機能します。ブースト正規表現ライブラリの元の問題はまだ存在しますが、ブーストを共有ライブラリに静的にリンクするか、-flat_namespace スイッチを使用してブースト ライブラリを再構築することで解決できると思います。

更新: これで、boost regex 式を使用した最初の例に戻り、次のコマンドでビルドします。

しかし、拡張機能を Ruby インタープリターにロードすると、静的シンボルの初期化が失敗します。

繰り返しますが、上記の小さな C プログラムで共有ライブラリをロードすると、これは失敗しません。

更新: ここで、最初の静的例をリンクします。

同じエラーで:

otool -L は、すべてのライブラリが静的にリンクされていることを確認しました:

デバッグ:

ブースト デバッグ バージョンにリンクすると、期待どおりに動作します。

0 投票する
1 に答える
485 参照

c - ruby は文字列を内部的にどのように表現するのですか?

ruby の C-Extension を作成しているときに、考えさせられるトラブルに遭遇しました。Ruby (1.9.1) が文字列 (およびすべてのエンコーディング) を内部でどのように処理するのだろうか?

のような文字列があり"o"、その文字列を C 関数 ( as として) に渡すと、 とマクロVALUEを使用して非常に簡単に処理できます。ただし、文字列(ドイツ語のウムラウト文字) を作成すると、.RSTRING_PTR()RSTRING_LEN()öRSTRING_LEN()2

その場合の の内容に少し困惑していRSTRING_PTR()ます。2 バイトは0xA40xC3です。これは何のエンコーディングですか?文字列をC関数に渡す前に、さまざまなエンコーディングで使用"ö".force_encoding( ... )してみましたが、内容にはまったく影響しませんRSTRING_PTR

私が必要としているのは、文字列をC 関数でWCHAR*エンコードされたUTF-16( の場合は"ö")として表す方法0x00F6ですが、どのエンコーディングから来ているのかわからない場合、それはちょっと難しいです。 ..

事前に助けを求めるthx

0 投票する
1 に答える
5281 参照

c - WindowsでRubyC拡張機能をコンパイルしてlibcurlをリンクする方法

libcurlを使用するRubyC拡張機能を構築しようとしています。これまでのところ、Os Xで正常に構築できました。ただし、Windowsでの開発経験ははるかに少なく、これを行う方法が正確にはわかりません。

これまでのところ、これらの手順に従うことで、VisualStudioコマンドプロンプトからextconf.rbとnmakeを使用してRubyC拡張機能をコンパイルできます。

http://blogs.law.harvard.edu/hoanga/2006/12/14/getting-a-ruby-c-extension-to-compile-on-windows/

ただし、私の拡張機能はlibcurlにリンクしていますが、extconf.rbにこれを確認する行があります

makefileを作成すると、次のようになります。

nmakeを実行すると、

インストールされていないため、これはすべて予想されます。curl-7.26.0-devel-mingw64をダウンロードしました(これはWindows 7に適していると思います)

Windows環境で、コンパイラがそれらを見つけられるように/binまたは/includeを配置する必要がある場所がわかりません。

0 投票する
1 に答える
163 参照

ruby - Ruby オブジェクトへのローカル参照が収集されないようにする方法

私は、Ruby スレッドではなく、Ruby スレッド内から C++ コードでいくつかのより大きな Ruby データ構造を構築しなければならない状況にいます。

スタック上に作成された Ruby オブジェクトは、Ruby GC によって収集されないように特別に処理する必要がありますか? オブジェクトが Ruby で作成されているか、Ruby 以外のスレッドで作成されている場合、違いはありますか?

例:

すべての関数呼び出しがメモリを割り当てて、ガベージ コレクターを呼び出すことができると思います。グローバル変数を介して到達可能になるまで、h、k、および v が収集されないように特別な注意を払う必要がありますか? 多分このように:

2 番目のバージョンははるかに複雑なので、GC がすべてのスレッドをスキャンして参照の可能性を探すという保証がある場合は、これを避けたいと思います。

編集:おそらくrb_gcのような関数を使用すべきではないことに気づきました... gvlを保持しない非ルビースレッドから。したがって、GC が Ruby スタックからの参照をマークするという保証があれば十分です。

TIAトルステン

0 投票する
1 に答える
182 参照

c - Ruby C API を使用したシンボルの等価性のテスト

Ruby C API でシンボルの等価性をテストする方法を見つけようとしています。次の C 関数を検討してください。

Ruby の観点からは、このメソッドは期待どおりに動作しません。

これはなぜですか?期待される動作を実現するには、コードをどのように変更する必要がありますか?

0 投票する
4 に答える
42664 参照

ruby-on-rails - エラー: Mac マウント ライオン OS にレールをインストールするときに、gem ネイティブ拡張機能をビルドできませんでした

最近、Mountain Lion にアップデートして Ruby を再インストールしましたが、Rails アプリのテストを実行しようとすると、システムに「Rails は現在インストールされていません」というエラー メッセージが表示されます。私はそれが言うことを行い、入力sudo gem install railsして取得します:

しかし、インストールされているレールのバージョンを確認すると、次のようになります。

私も試してみましたgem install rails

0 投票する
1 に答える
211 参照

c - Ruby C 拡張機能のコンパイル エラー: 'event' の前に ')' が必要です

イベントフックを追加するために、Ruby を C 拡張で拡張しようとしています。

残念ながら、次のエラーが表示されます。

私が書いたコード:

誰かがこの問題を解決するのを手伝ってくれますか? 前もって感謝します。

0 投票する
2 に答える
220 参照

c - Ruby で C 拡張機能を作成する

ruby 用の C 拡張機能を作成しようとしています。私は開発に非常に慣れておらず、Ruby に慣れたばかりなので、本当に迷っています。

「Ruby で 5 分以内に C 拡張機能を作成する方法」を見てきましたが、それは理にかなっています。問題は、C コードと Ruby コードをコンパイルするために使用するプログラムがわからないことです。Ruby プログラミングにテキスト ドキュメントを使用してきたので、コンパイルする必要はありませんでした。

(前述のモデルに従って) C 拡張機能を作成したい場合、どの IDE を使用し、どのファイル形式にコンパイルしますか? また、Ruby ファイルと C コンパイル済みファイルはどこに配置すればよいですか? 最後に、単純なメモ帳エディタはこの Ruby 開発に使用できますか? 私は一般的にプログラミングに慣れていないので、これらの質問は素朴に見えるかもしれません。