我有一个简单的 mex 函数,它从库中调用另一个 C++ 函数。我编译源代码
mex -cxx mymexfunction.cpp -I/some/include -L/some/lib -lmylib
mylib 库是动态的 (.so),并且自身与其他一些库(boost、OpenCV 等)链接。
我遇到的问题是,一旦我调用了函数 mymexfunction 一次,当我重新编译源代码时它就不会更新。我努力了
clear
clear all
clear mex
clear functions
clear fun('mymexfunction')
munlock('mymexfunction')
unloadlibrary('mymexfunction')
...但是没有任何帮助!我必须重新启动 Matlab 才能看到更新后的 mexfunction。即使我删除编译后的mex文件并重新编译,我仍然得到旧版本的mex函数(不在磁盘上,而是在内存中)。
如果我不链接到 mylib,一切都很好,但我不知道阻止更新的罪魁祸首是什么。遗憾的是,该库太大且过于交织,无法一一删除单个模块。
是否存在一些可能导致此类问题的已知条件?
澄清:
我只更新 mex 函数的内容,而不更新库。
Update:
它可以在 Ubuntu 11.04 和 Matlab R2011a 下运行!我尝试在我的 OpenSUSE 机器上重现相同的环境(R2011a、Boost 1.42、OpenCV 2.2 动态链接,...),但仍然没有成功。所以我得出的结论是,我的库实际上没有任何问题(否则它无法在 Ubuntu 下工作),但一定是依赖项和 Matlab 内部库发生了一些冲突。我正式放弃。 Praetorian 和 Amro,感谢你们的帮助!
The mex
如果当前已加载到内存中,命令会自动清除 mex 函数。您确定您的 mex 函数正在关闭它持有的其他库的任何句柄吗?如果存在这样的句柄,它可能会阻止操作系统卸载 mex 文件。
我使用了以下一组命令来手动清除 mex 函数,根据我的经验,在调用时使用 mex 文件的完整路径clear
作品。因此,尝试一下,如果它仍然没有被卸载,您可能需要开始查看用于加载和卸载其他库的代码。
[~,f] = inmem( '-completenames' );
result = strfind( f, ['mymexfile' '.' mexext] );
result = f(cellfun( @isempty, result, 'UniformOutput', true ) == 0);
clear( result{:} )
尝试运行inmem
在上述命令之后再次命令,看看您的 mex 文件是否仍然列出。
可以帮助您确保卸载其他库的方法可能是使用std::shared_ptr
持有该库的句柄。然后,在开始时mexFunction()
入口点加载库并将句柄插入shared_ptr
. The shared_ptr
还需要使用自定义删除器来卸载库(在 Windows 上,自定义删除器将调用FreeLibrary
).
当然,如果这是由其他库中的错误引起的,那么这些都没有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)