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.