問題タブ [libffi]

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 に答える
927 参照

ruby - solaris に rb-inotify をインストールする

Solaris ボックスに rb-inotify をインストールしようとしています。uname -aの結果:

ruby-1.8.7 および ruby​​gems-1.7.2 はコンパイルおよびインストールされていますが、実行後

次のエラー メッセージが表示されました。

その後、rb-notify のホームページで、 Linuxカーネル サブシステム inotifyのラッパーであることがわかりました。それが、Solaris ボックスにインストールできない理由ですか?

しかし、人々が rb-notify を Windows マシンに問題なくインストールしていることは知っていますが、inotifyが「Linuxカーネル サブシステム」である場合、どのように機能するのでしょうか?

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

c - 関数のポインタではなく、関数の名前を呼び出します

libffi のマンページには、基本的に関数へのポインターが必要な例が示されています (例の場合はputs)。

ただし、関数の名前しか知らないが、実際にはポインターを持っていない場合はどうすればよいでしょうか (通常、動的プログラミング言語で ffi が使用されている場合に発生します)。

たとえば、次のようなことをしたい (疑似コード):

要するに、dlfcn/LoadLibrary と同様に、libffi に関数を動的に検索させ (最初に ffi でサポートされている場合)、提供された FFI CIF タイプで呼び出します。

libffiでそのようなことは可能ですか?簡単な例はどのようになりますか?

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

c++ - 可変個引数テンプレート:型/テンプレート引数を反復処理します

私は最近libffiを使用していますが、C APIを使用しているため、抽象化はvoidポインター(古き良きC)を使用して行われます。このAPIを利用するクラス(可変個引数テンプレートを使用)を作成しています。クラス宣言は次のとおりです。(ここで、Ret=戻り値およびArgs=関数の引数)

このクラス内で、2つの異なる関数も宣言されています(簡略化)。

Callから使えるようになりたいCallbackBind; それが私の問題です。void*配列をテンプレート化された引数リストに変換する方法がわかりません。これは私が多かれ少なかれ欲しいものです:

これが達成できない場合、回避策やさまざまな解決策がありますか?

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

c++ - テンプレートプログラミング:特殊化とenable_if

私はlibffiを使用していて、std::function(つまり、リターンタイプ( )と各引数タイプ()を対応するlibffiタイプclass Func<Ret (Args...)> { /* ... */};に変換したい)と同様のテンプレートを使用してクラスを作成しました(これまでのところ、これを参照してください)。私はこれを思いついた:RetArgs

GetFFIType関数が次のように実装されている場合:

これは機能しますが、明らかに改善の余地があります。タイプが無効な場合(つまり、クラスまたは構造)、コンパイル時に識別されません(代わりにを使用してランタイムエラーが発生しますassert)。これを回避し、コンパイル中に型が有効(プリミティブ型)であるかどうかをこの関数に判断させるにはどうすればよいですか?

また、sの場合に基になるタイプを識別する方法も嫌いですenumstd::underlying_type<T>代わりに(コードでコメントアウトされている)使用したいのですが、タイプがたとえばvoidポインター( type_traits:1762:38: error: ‘void*’ is not an enumeration type)の場合、コンパイルエラーが発生します。

私はこの動作を使用して達成しようとしましstd::enable_ifたが、成功しませんでした...少しあいまいに聞こえた場合に備えて、何かを説明する必要があるかどうか教えてください!

概要:GetFFIType関数を取得して、コンパイル中にすべてを判別したいのですが、関数はプリミティブ型のみをサポートする必要があります(より詳細なリファレンスについては、これを参照してください)。

編集:タイトルについて申し訳ありませんが、これ以上のことは思い浮かびませんでした:(

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

c - Cでは、引数の可変リストが与えられた場合、それらを使用して関数呼び出しを作成する方法は?

たとえば、配列に何らかの形で格納された引数のリストがあるとします。

関数 pointer が与えられた場合、格納されている引数のリストを渡して関数を呼び出すにはどうすればよいですか?

配列を引数として渡そうとはしていません。わかりましたか?その各要素を引数として渡したい。配列は単なる例です。引数をタプル構造に格納できます。また、手元に関数ポインターがあり、文字列形式の署名がある可能性があることを確認してください。可変長リストを処理できる関数を定義しようとしているだけではありません。

私がそれを行う唯一の方法は、アセンブリ(by __asm pushet al。)またはこれを使用することです:

私はこのアプローチがあまり好きではありません...

別のポータブルで短い形式はありますか?

いくつかのスクリプト言語は、C 関数を呼び出すことができます。

Python や Ruby などのスクリプト言語はどのようにそれを行うのでしょうか? 移植可能な方法でどのように実装しますか? 最終的に、いくつかのプラットフォームまたは上記のアセンブリを使用するだけですか?

スクリプト言語から C へのパラメータ マーシャリングやその他の詳細については質問していないようです。最終的に内部的に、スクリプト言語による C 関数の呼び出しがどのように構築されるかだけに関心があります。

編集

質問のタイトルはそのままにしますが、質問のより良い方法は次のとおりだと思います。

実行時にのみ使用可能なポインターとシグネチャーを使用して C 関数を呼び出す方法は?

アップデート

PLT スキームの外部インターフェイスから:

コールアウトは通常の関数呼び出しです。動的設定では、(バイナリ) 入力/出力タイプを指定する「呼び出しインターフェイス」オブジェクトを作成します。このオブジェクトを任意の関数ポインタおよび入力値の配列とともに使用して、関数へのコールアウトを実行し、その結果を取得できます。これを行うには、スタックを操作し、関数がどのように呼び出されるかを知る必要があります。これらは、libffiが処理する詳細です。

@AnttiHaapala にlibffiを検索、検出、および指定していただきありがとうございます。それは私が探していたものであり、多くのスクリプト言語で使用されており、いくつかのアーキテクチャとコンパイラにまたがって実装されたポータブル ライブラリです。

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

linux - CMake で libffi ヘッダー ファイルを見つける

C++ プロジェクトをビルドするには libffi が必要です。問題は、libffi を見つけるための事前作成されたスクリプトが存在せず、ffi.h がライブラリのバージョンと Linux ディストリビューションによっては奇妙な場所にあることです。

これは私の試みです:

しかし、Find_Path() は再帰的に検索しないため、明らかに機能しません。それをより良くする方法は?

CMake の pkg-config モジュールを使用しようとしましたが、pkg-config でも見つかりません。

[ethon@Fleckstation Paper]$ pkg-config --cflags libffi パッケージ libffi が pkg-config 検索パスに見つかりませんでした。おそらく、「libffi.pc」を含むディレクトリを PKG_CONFIG_PATH 環境変数に追加する必要があります パッケージ「libffi」が見つかりません

ありがとう!

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

linux - Linux libffi-3.0.11 インストールの問題

私は libffi-3.0.11 をインストールしようとしました 私はその側に従いました

http://www.linuxfromscratch.org/blfs/view/svn/general/libffi.html

しかし、このエラーメッセージが表示されました。どうすれば解決できますか?

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

c++ - VS2012でlibffiをコンパイルすると、致命的なエラーLNK1281で失敗します:SAFESEHイメージを生成できません

libffiをVS11でコンパイルすると、次のリンカーエラーが発生します

同じプロジェクトはVS10で正常にコンパイルされていましたが、VS2012で自動アップグレードした後、リンカーエラーが発生し始めました

MSDNの説明はわかりにくいため、あまり役に立ちません。

で再構築するかもしれませんが/SAFESEH:NO、その意味がわかりません。

何がうまくいかないか教えてください。

0 投票する
3 に答える
2116 参照

c - cffi-libffi で構造体を値渡ししますか?

私はCFFIが構造体を値で渡すことができないという印象を受けていますが、CFFIのドキュメントには次のように書かれています:

値によって構造体を関数に渡したり返したりするには、cffi-libffi システムをロードし、構造体を として指定します(:struct structure-name):pointerポインタを渡したり返したりするには、またはを使用できます(:pointer (:struct structure-name))

get-sizeこのopencv関数のラッパーであるcl-opencv関数を再ラップしています:

また、cl-opencv の作成者がライブラリを作成したとき、CFFI には cffi-libffi システムで値によって構造体を渡す機能がなかったと思われるため、次のすべてのコードを使用してラップする必要がありましたcvGetSize

上で引用した CFFI ドキュメントを考えると、このcvGetSize構造体CvSizeを値で渡すにはどうすればよいでしょうか?

cl-opencvパッケージを更新するつもりです。cl-opencv パッケージのどこで、どのように CFFI ドキュメントに従って「cffi-libffi システムをロード」し、どこで「構造を」と指定するかを知りたいです(:struct structure-name)。そして、「:pointer または (:pointer (:struct structure-name))」のいずれかを使用して、「ポインターを渡すか返す」。

上記のcvGetSizeラッパーを使用してそれを行う方法の詳細な手順を使用できます。

@Rördの編集

誠実な対応に感謝します

どちらの方法でも同じエラーが発生します...しかし、テスト目的で、このようにcffi-libffiを現在のセッションにロードするとしましょう(出力付き)

ロードされるので、次のように提供した defcfun と defcstruct のみを実行します (出力付き):

gsll をロードした状態で (cffi-libffi を使用)、gsll テストを実行すると、ここに示されているすべてのテストに合格するため (出力付き)、libffi が正しくインストールされていることがわかります。

問題として (:struct cv-size) を使用して defcfun を呼び出しているようには見えません。

私は同じエラーが発生します

このように ipl-image 構造体を実行できます

そして、cffi-libffiがロードされ、あなたの(:struct ipl-image)が正常に動作するようになった私のcreate-imageラッパーは...出力で示されています

イメージの作成

しかし、私が走るとき

repl でイメージを作成しても何も起こらず、repl がハングするだけです...

しかし、(:struct ipl-image) の代わりに ipl-image を使用して create image ラッパーを実行すると

私は実行できます:

これを実行して構造体の値にアクセスします(出力あり)

しかし、私は取得した値で構造体を取得していません

これを使用してcでその値img-> colorModelを計算すると

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

わかりました 1 つ以上の編集:

私はそれをもう一度試してみましたが、ここで私の出力です

初めて何を間違えたのかわかりませんが...結果を確認して、構造体を値で渡したばかりであることを確認できれば、永遠に感謝します

ありがとうロッド

ロッドのデバッグを手伝ってくれることにまだ興味があるなら、もう一度編集してください

エラーが発生した場合:

そして、これがそれを引き起こした履歴です(これは、前の編集を投稿した直後に発生したため、私のemacsにはすべての前の編集コードがまだロードされています):

私はそれを得る:

defunにアクセスします...私はそれをトレースしたので、実行したとき-出力で表示されます:

エラーが発生します:

defcfun の出力は単なるリストであり、with-foreign-slots にはポインターが必要なためだと思います

私はこれを実行しました:

確認するため、その単なるリスト

ところで、これらの関数をテストに使用しました

より純粋な出力があるため... create-image は、最初にこの上部に投稿した get-size のハッカーを使用していますか?

私はすべてのハッカーなしで create-image と get-size を使用し、戻り値に構造体を使用するだけで、make-size の使用をやめてより純粋にすることができます....それについてのアドバイスは金になる...これが私がcreate-imageを持ちたい方法です...私はあなたの(Rordの)defcfunからの出力を受け入れるためにそれを得なければなりません...私は今あなたのdefcfun出力を変えようとしています((HEIGHT 480 WIDTH 640)) ポインタへ...だから、これで実行されます

それとも、メイクサイズ全体が必要になるのでしょうか...

また、参考までに、追加したdefunを変更しました

そして、それは今でも動作します...私が何かを台無しにした場合、そしてあなたのdefunがより優れていた場合、まだ好奇心が強いです

編集!!!!私はそれをすべて理解しました!!!!!

EDIT!!!!I GOT IT ALL FIGURED!!!!!!!!...Part....II - さらに良い!

@リアム編集

わかりました、translate-from-foreign メソッドを試してみましたが、うまくいきました。これらは structs.lisp ファイルで定義されています

get-size と create-image は次のように定義されます

これが size->int64 の定義です

しかし、私はtranslate-foreign defmethodのアイデアが大好きです

だから、以下の from メソッドの外国語への翻訳バージョンを作成する方法を教えてもらえないかと思っていました.これは gsl に対するものなので、これは本当に迅速に行われるのに役立ちます....これまでのすべてについてご協力いただきありがとうございます

0 投票する
0 に答える
172 参照

c++ - 関数を呼び出さないlibffi

libffi を使用して関数を呼び出しています。しかし、それは同じものを呼び出していません。また、エラーは発生していません。float 値が返されることを期待していますが、0.0000 として返されます。期待される戻り値ではないと確信しています(ハードコーディングを試みました)。

私はここで何か悪いことをしていますか? ffi_call が成功したかどうかを確認する方法はありますか?