gpt4 book ai didi

matlab - Mex 函数在重新编译后未更新

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:28 24 4
gpt4 key购买 nike

我有一个简单的 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 函数的内容,不更新库。

更新:

它在 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{:} )

在执行上述操作后再次尝试运行 inmem 命令,看看您的 mex 文件是否仍然在列表中。

可以帮助您确保卸载其他库的方法可能是使用 std::shared_ptr 来保存此库的句柄。然后,在 mexFunction() 入口点的开头加载库并将句柄插入 shared_ptrshared_ptr 还需要使用自定义删除器来卸载库(在 Windows 上,自定义删除器将调用 FreeLibrary)。

当然,如果这是由其他库中的错误引起的,那么这些都无济于事。

关于matlab - Mex 函数在重新编译后未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7012408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com