1

我正在尝试创建一个 mex 文件,该文件将 MATLAB 与与某些硬件通信的外部 C++ 库接口。硬件供应商为我的 VC++ 版本提供了一个导入的库和预编译的 DLL(.lib 和 .dll),我能够在 C++ 中毫无问题地实现它们。

但是,当代码编写为 mex(使用相同版本的 VC++ 编译)时,我在运行时遇到了分段错误。在使用 VC++ 调试器进行一些调查之后,可能的罪魁祸首似乎是外部 dll 函数之一返回数据类型 std::vector 的事实,并且可能会尝试为函数内部某处的向量容器动态分配内存。我知道如果我在自己的 mex 函数中使用 std::vector ,一切正常,但我怀疑 mex 标头本身将 std::vector 容器包装在我自己的内存管理代码中(?)在 mex 代码中分配内存,而对于预编译的 .dll 则不能这样做。

现在的问题是:由于我无法修改外部 .dll 文件并且无法访问其源文件,是否有任何方法可以使用此外部 dll 以使动态内存由 MATLAB 管理(也许是某种包装器。 .?)...从而避免分段错误并返回正确的数据?或者如果我的分析是错误的,也请纠正我!

如果有任何想法或黑客,请告诉我,谢谢!

我的系统:Windows 7 SP1 32 位,MATLAB 2009b,Visual C++ 2008 Pro。

我还在以下位置发布了相同的问题: http: //www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-错误 。如果您有帐户,也可以在那里分享您的见解,谢谢!

4

2 回答 2

2

感谢大家的回答和评论。在 MathWorks 友好人士的帮助下,我能够解决这个问题。

来自http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error的原始帖子:

您可能会看到预编译的 dll 使用的 stl 库和/或编译器选项与 MATLAB 和 MEX 命令使用的选项不兼容。MATLAB 2009b 是使用 MSVC 2005 构建的。

您可以通过更改 mex 使用的选项或直接使用 MSVC 构建 mex 文件来解决问题。可能影响事物的选项的一个示例是 SECURE_SCL=0。我将首先使用 MATLAB 用来查找有问题的选项的选项构建您的测试程序,然后在构建 mex 文件时尝试删除该选项。

由于这种不兼容,在第三方编译库的 api 中使用 stl 对象通常是一个坏主意。

按照他的建议,我从 mex 选项文件中删除了 SECURE_SCL=0 选项

C:\Users\(用户名)\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat

然后重新编译了 mex 文件,现在一切都像魅力一样 - 该函数正在返回正确的数据并且不再发生分段错误。

于 2011-06-13T20:59:50.323 回答
1

MEX API 没有对 STL 容器做任何特殊的事情,因为它们不能在 MATLAB 和 MEX 函数之间传递(唯一可以做到这一点的非原始数据类型是 mxArray)。基本上由 MEX 函数来确保 STL 容器使用的内存得到正确处理;MATLAB 不跟踪它。

跨 DLL 边界传递 std::vector 有点棘手。我假设供应商会意识到这一点,并为您提供具有正确 declspecs 等的适当头文件,但如果他们没有,您可能需要参考此 Microsoft 支持链接以了解更多关于什么是必须的。

于 2011-06-12T14:39:21.453 回答