2011-06-12 54 views
1

我想创建一个mex文件,将MATLAB与一个与某些硬件进行通信的外部C++库进行接口连接。导入的库和预编译的DLL(.lib和.dll)由硬件供应商为我的VC++版本提供,并且我能够在C++中实现它们而没有任何问题。链接的外部DLL中的std :: vector存在Mex动态内存管理问题;分割错误

但是,当代码被编写为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-error 。如果您有帐户,也可以在这里分享您的见解,谢谢!

+0

无论mex是什么,似乎你需要阅读它的文档。包装工具通常有关于内存管理的可配置策略。 – zvrba 2011-06-12 06:01:48

回答

2

谢谢大家的回答和意见。我能够在MathWorks的友好人员的帮助下解决问题。

从原来的职位在http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error

你可能会看到STL库,并或通过您的预编译的dll使用的编译器选项和那些由MATLAB和MEX命令使用之间的不兼容。 MATLAB 2009b使用MSVC 2005构建。

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

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

按照他的建议,我删除了SECURE_SCL = 0选项从MEX选项在

C文件:\用户\(用户名)\应用程序数据\漫游\ MathWorks公司\ MATLAB \ R2009b中的\ mexopts.bat

然后重新编译mex文件,现在一切都像一个魅力 - 功能正在返回正确的数据和分割错误不再发生。

1

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

跨DLL边界传递std :: vector有点棘手。我假设供应商会意识到这一点,并为您提供正确的declspecs等适当的头文件,但如果他们不这样做,你可能想参考this Microsoft support link阅读更多关于需要什么。

+1

感谢SC,事实证明这是一个不兼容的问题,并已在这里解决,http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector -in-linked-external-dll-segmentation-error – ddwp99 2011-06-13 20:39:30

+1

@dpwave:您应该发布您找到的解决方案,并将其标记为接受的答案 – Amro 2011-06-13 20:45:11