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