問題タブ [perl-xs]
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.
c - XS このコードでメモリリーク?
このコードでメモリ リークが発生している場所を見つけることができません。
基本的に、2 次元配列を返す C 関数の XS ラッパーを作成したいと考えています。
C 関数:
XS ラッパー:
XSからは「配列の配列」が返ってきます。
Perl スクリプトでのテスト:
関数が呼び出されるたびにreturnArray()
、Perl プロセスのコミット サイズが増加します。しかし、$arrayref
変数は毎回ガベージコレクションされ、メモリ使用量は増加しないはずです。
XSで割り当てられたすべてのメモリを解放していることを願っています。しかし、まだメモリリークがあります。この XS コードのメモリ リークの何が問題なのですか?
c++ - json SVまたはC++文字列をHVに変換する簡単な方法はありますか
C++ クラスに json 文字列があり、これを SV に変換し、perl モジュールにスカラーとして返します。このスカラーを解析し、perl モジュールで json に変換しています。
代わりに、C++ クラス自体で json 文字列を HV または perl ハッシュに変換し、それを perl ハッシュとして perl モジュールに返したいと考えています。これを行う簡単な方法はありますか。
最後に、この json c 文字列を JSON オブジェクトに変換したいと思います。
例:
私のtest.cppには
これを SV (perl スカラー) に変換し、perl スクリプトに送信しています。
私のtest.plでは、JSON::XSを使用して、perlハッシュまたはjsonにエンコードおよびデコードしています。
実際に私が探しているのは、json でエンコードされた c++ 文字列をネイティブ json に変換し、それを自分の perl モジュールに返すことです。これが可能かどうかはわかりません。私が知っている1つの解決策は、jsonでエンコードされた文字列を解析し、それをperlハッシュに変換してperlモジュールに送信し、perlモジュールがそれをネイティブjsonに変換することです。ただし、この場合、json でエンコードされた c++ 文字列の解析にはコストがかかります。これは、文字列が非常に長い json 構造になる可能性があるためです。
しかし、これの代わりに
- C++ ファイルから perl ハッシュ ($perl_hash_or_arrayref) を返す簡単な方法はありますか?
- または、c++ ファイルから json($perl_hash_or_arrayref) を返します。
前もって感謝します!!
c - Perl の ExtUtils::MakeMaker を使用して、XS モジュールと同じ設定を使用して実行可能ファイルをコンパイルするにはどうすればよいですか?
C ライブラリを使用する Perl XS モジュールが与えられた場合、すべてのヘッダーとライブラリの場所、コンパイラとリンカー フラグなどが正しく機能するように正しく設定された Makefile.PL があると仮定します。
ここで、同じ基礎となる C ライブラリを使用する前述の XS モジュールに小さな C プログラムを含めたいとしましょう。同じ設定とフラグでビルドされるように、ターゲット実行可能ファイルを指定する正しい、プラットフォームに依存しない方法は何ですか?
私が次のことをしたら
への引数で設定したそれらのインクルードの場所、ライブラリのリストなどを取得しませんWriteMakefile
。手動でルールを書き始めると、少なくともmake
、dmake
、およびを考慮する必要がありnmake
ます。ExtUtils::CBuilderを使用する場合、リンクするライブラリを指定する簡単な方法がわかりません。
私は何かが欠けているに違いない。ご指摘いただければ幸いです。
perl - Perl XS モジュールから別の C ソース ファイル内の関数を呼び出すにはどうすればよいですか?
Perl で XS エクステンションを構築しています。私は2つのファイルを持っています:
- AC ヘッダー ファイル (
.h
) - AC ソースファイル (
.c
)
現在私が行ったことは、すべての C ファイル コードをModel=
XS ファイルの の前に配置し、必要な関数を の後にラップすることですModel=
。
コンパイルは問題なく動作し、perl から特定の関数を呼び出すことができます。
.xs
しかし、ファイルをCファイルから分離したい。
ファイルにラップ関数のみを含めたいの.xs
ですが、それらの関数はファイルの関数を呼び出し.c
ますが、それを実行してdmake
コマンドを実行すると、「parse.c」ファイルへのエラー コード 129 未定義の参照が表示されます。
WriteMakerFile の C および OBJECT プロパティを使用して .c ファイルをインクルードしようとしましたが、xs ファイルを 2 つの 1 つの c ファイルと .c ファイルの一部である c 関数をラップする他の xs に分割する方法についてまだエラーが発生しますExtUtils::MakeMakerを使用します。
例をいただければ幸いです。
cmake - コンパイル時にプログラムの終了ステータスを使用する方法は?
この質問は、私の前の質問の続きです:この種のソース ジェネレーターを CMake ビルド チェーンに統合するにはどうすればよいですか?
現在、C ソース ファイルは次の方法で XS から生成されます。
このGENERATED
プロパティにより、cmake は構成時にこのソース ファイルの存在をチェックせず、add_custom_target
コンパイルxsubpp
のたびに常に再実行できます。常に再実行する理由はxsubpp
、失敗しても不完全なソース ファイルが生成されるためです。そのため、コンパイル全体が不完全なソース ファイルで続行される可能性があります。
ソースジェネレーターを常に再実行して再コンパイルするのは時間がかかることがわかりました。したがって、依存する XS ファイルが変更された場合にのみ再実行したいと考えています。ただし、そうすると、生成された不完全なソース ファイルを削除する必要があります。
私の質問は、コンパイル時にプログラムが異常終了した場合にのみ、生成されたファイルを削除する方法はありますか?
またはより一般的な: コンパイル時に別のコマンドの終了ステータスに応じてコマンドを実行する方法はありますか?
c - 警告を解決: 'const void *' をタイプ 'AV *' のパラメーターに渡します
libmba を含む XS モジュールをコンパイルする C での初心者レベルの経験では、この警告を解決できません。
コンパイルされたモジュールは正常に動作しています。しかし、警告なしにコーディングする方法はありますか?
LCS/XS.xs の関連部分:
mba/diff.h の部分
そして、mba/diff.c で:
libmba のソースを変更せずにこの警告を解決する良い方法はありますか?
解決済み: