GNU/Linux >> Linux の 問題 >  >> Linux

LibraryUnload の失敗

トッド・ゲイリーはかつて LibraryLoad と言いました 必要な依存ライブラリをプリロードするためのものです。たとえば、数値ライブラリを必要とする関数を作成する場合、ライブラリ内の関数を呼び出す前にこれをロードできます。

WolframLibrary ライブラリをプリロードする必要はありません 関数をロードすることによって暗黙的にロードするため、開発したことになります。

したがって、問題の解決策は LibraryFunctionLoad を呼び出す必要があると思います あなたが開発している機能の1つに、その後 LibraryUnload

さらに、すべての関数を LibraryFunctionUnload でアンロードする必要があります ライブラリをアンロードする前に。


(元の質問の linux タグにもかかわらず、Windows ユーザーにとって共有する価値のある情報です。)

このコメントが述べたように、Windows プラットフォームには追加の問題があります。解決策がある限り、ここで説明します。

LibraryUnload Windows での障害の問題

「スタンドアロン」ライブラリ myLib.dll があるとします。 Mathematica や LibraryLink とは関係ありません。次に、libLink.dll があります。 myLib を使用する また、LibraryLink を通じて Mathematica に関数を提供します。

libLink として myLib に依存 myLib をプリロードしようとするかもしれません libLink をロードする前に 、問題なく動作します:

LibraryLoad["myLib.dll"]
myfunc = LibraryFunctionLoad["libLink.dll", ... ]

しかし、Windows では、

でアンロードしようとすると、
LibraryUnload["libLink.dll"]
LibraryUnload["myLib.dll"]

前者は成功しますが、後者は失敗してエラー メッセージが表示されます

LibraryFunction::unloadlib: The library myLib.dll cannot be unloaded.

Process Explorer などのツールを使用すると、ファイルのハンドルがカーネルによって解放されていないことがわかります。

解決策

説明されている問題は、myLib を開発しているときにイライラすることがあります。 . myLib を再コンパイルする前に毎回カーネルを強制終了する必要があります . ilian (私のコードを非常に寛大にレビューし、問題を調査してくれました) によって発見され、親切に共有された解決策は、

myLib を手動でプリロードしない LibraryLoad

代わりに、OS 環境を変更して、Windows がすべての依存ライブラリを見つけて自動的に管理できるようにすることができます。

SetEnvironment["PATH" -> Environment["PATH"] <> ";" <> "path_to_folder_of_myLib.dll"]
myfunc = LibraryFunctionLoad["libLink.dll", ... ]

アンロードは次のように簡単になります:

LibraryUnload["libLink.dll"]

その後、myLib.dll への参照が他にない場合 、編集可能になります。


Linux
  1. サーバーをラックに入れたことはありますか?

  2. VsftpdはPam認証に失敗しますか?

  3. Globbedファイル名へのリダイレクトが失敗しますか?

  1. -execが失敗した場合の検索から抜け出しますか?

  2. lldbinit のプロセス ハンドル

  3. mv が中断されるとどうなりますか?

  1. 私のLinuxシステム管理者サバイバルキット

  2. 1つのSudoで一連のコマンドを実行しますか?

  3. s3cmd が何度も失敗する