GNU/Linux >> Belajar Linux >  >> Linux

LibraryUnload gagal

Todd Gayley pernah menyebutkan bahwa LibraryLoad adalah untuk pre-loading depend library yang Anda butuhkan. Jadi misalnya, jika Anda menulis fungsi yang memerlukan pustaka numerik, Anda dapat memuatnya sebelum memanggil fungsi di pustaka Anda.

Anda tidak perlu melakukan pramuat perpustakaan WolframLibrary Anda telah mengembangkan karena Anda memuatnya secara implisit dengan memuat fungsi-fungsi di dalamnya.

Oleh karena itu, saya yakin solusi untuk masalah Anda adalah Anda harus memanggil LibraryFunctionLoad pada salah satu fungsi yang Anda kembangkan dan setelah itu LibraryUnload harus berfungsi seperti yang diharapkan.

Selanjutnya, Anda harus membongkar semua fungsi dengan LibraryFunctionUnload sebelum membongkar perpustakaan.


(Informasi yang layak dibagikan untuk pengguna Windows terlepas dari tag linux di pertanyaan awal.)

Seperti yang disebutkan komentar ini, ada masalah tambahan pada platform Windows, yang akan saya coba uraikan di sini, asalkan ada solusi untuk itu.

LibraryUnload masalah kegagalan pada Windows

Misalkan seseorang memiliki perpustakaan "mandiri" myLib.dll , yang tidak ada hubungannya dengan Mathematica atau LibraryLink. Kemudian seseorang memiliki libLink.dll , yang menggunakan myLib dan menyediakan fungsi ke Mathematica melalui LibraryLink.

Sebagai libLink bergantung pada myLib , seseorang dapat mencoba memuat myLib terlebih dahulu sebelum memuat libLink , dan berfungsi tanpa masalah:

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

Tapi kemudian, di Windows, jika ada yang mencoba membongkarnya dengan

LibraryUnload["libLink.dll"]
LibraryUnload["myLib.dll"]

Yang pertama akan berhasil tetapi yang terakhir akan gagal dengan pesan kesalahan

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

Dengan menggunakan alat seperti Process Explorer, seseorang dapat melihat pegangan file belum dirilis oleh kernel.

Solusinya

Masalah yang dijelaskan dapat membuat frustasi ketika seseorang sedang mengembangkan myLib . Seseorang harus mematikan kernel setiap kali sebelum mengkompilasi ulang myLib . Solusinya, yang ditemukan dan dengan baik hati dibagikan kepada saya oleh ilian (yang telah dengan murah hati meninjau kode saya dan menyelidiki masalahnya.), adalah

TIDAK melakukan pramuat myLib secara manual dengan LibraryLoad di tempat pertama.

Sebagai gantinya, seseorang dapat memodifikasi lingkungan OS sehingga Windows dapat menemukan semua pustaka yang bergantung dan mengelolanya secara otomatis:

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

Bongkar sekarang akan sesederhana:

LibraryUnload["libLink.dll"]

Setelah itu, jika tidak ada referensi lain ke myLib.dll , itu akan dapat diedit.


Linux
  1. Jalankan Baris Perintah Dengan Satu Sudo?

  2. Cara Menyinkronkan Hanya Satu Partisi?

  3. Proses latar belakang di linux

  1. Menemukan konten dari satu file di file lain

  2. pegangan proses di lldbinit

  3. IP dari host lokal

  1. Cara menonaktifkan satu CPU

  2. Autossh gagal saat startup

  3. Karakter ekor dan wildcard