Matlab生成的thunk文件的目的是什么?

5
当从Matlab中调用外部C库(DLL)时,似乎Matlab首先会尝试在临时目录中生成一个名为filename_thunk_pcwinXX.dll(其中XX是32或64,取决于操作系统)的thunk文件。
在Matlab文档中,它提到这个文件是外部DLL和Matlab之间的接口,因此它不包含原始外部DLL的任何其他数据。
问题是,我编写了一个在运行时可能调用其他库的库,当库调用某些库(不是所有库,而且我的库和这里的其他库都是64位DLL)时,Matlab总是给我一些奇怪的结果甚至崩溃。
当被其他C/C++程序调用时,我的所有库函数都能无缺地工作。我只是想知道,为了让Matlab正常工作,是否需要让我的库在运行时调用的这些其他库也获得某种thunk文件?我只是不敢相信,但我也不知道Matlab如何处理外部库的确切方法。

问题:你的操作系统是什么?Windows?32位还是64位?Windows的哪个版本?问题:你的其他.dll文件是什么?32位还是64位的.dll文件?问题:Matlib在哪里?“C:\Program files (x86)”(32位)还是“c:\Program files”(64位,在64位Windows上)?另请参见:http://www.mathworks.com/help/matlab/ref/loadlibrary.html - paulsm4
@paulsm,由于操作系统是Windows 7-64位,而Matlab也是64位版本,我已经使用Matlab很长时间了,这是我第一次遇到这样的问题。 - user0002128
1
你的其他库的头文件是否明确声明了调用约定?Thunk 文件是一个兼容性工具,用于将代码从 MATLAB 翻译到其他语言。当你使用 MATLAB 编译 DLL 时,可能不想对调用约定做任何假设。事实上,你应该始终非常明确地表达所有内容。 - paddy
我已经使用Matlab玩了很长时间,这是我第一次遇到这样的问题。问:那么“有什么变化”?Matlib的新版本?第一次在Win7 / 64上运行?还是“其他原因”? - paulsm4
@paddy,Matlab构建代码,我只是让Matlab通过loadlibrary调用加载外部dll(不是mex文件),看起来它们会为每个加载的外部DLL(不是mex文件)构建一个接口DLL。 - user0002128
@paulsm4:除了一些不同但仍经过充分测试的英特尔数学库,它在运行时尝试链接的内容之外,没有其他任何东西。 - user0002128
1个回答

0

最近我不得不深入研究同样的问题。完整的技术细节在链接中,但简短的答案是:

Thunk DLL 是关于调整调用约定的

Thunk 函数 boolint32int32doubleThunk 在 Matlab 调用约定下接收其参数:所有参数按顺序传递到堆栈上,未经类型化并对齐 sizeof(size_t)(在 x64 中为 64 字节)。它还接收指向实际 DLL 导出的函数指针,并在将参数复制到本地类型变量后,使用其本机调用约定调用此函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接