【问题标题】:invalid MEX (The specified procedure could not be found): Building a CUDA MEX function in visual studio and calling it in MATLAB无效的 MEX(找不到指定的过程):在 Visual Studio 中构建 CUDA MEX 函数并在 MATLAB 中调用它
【发布时间】:2012-03-20 19:03:48
【问题描述】:

我有一个old visual studio project(cuSVM 项目),以前在 32 位 WinXP 中使用 Visual Studio 2005 SP1。我想在我的 64 位 Win7 中运行它。我在 64 位模式下编译它,使用 Visual Studio 2008。但由于缺少一些 dll,它无法运行。

我使用了“Dependency Walker”,缺少的 dll 是:

  • MSVCR80.DLL
  • MSVCR90D.DLL
  • IESHIMS.DLL

带有黄色问号,表示:“系统找不到指定的文件”。

在 DLL 树中,我在“c:\windows\system32\NVCUDA.DLL”中有一个红色的“NVCUDA.DLL”和一个红色块“IEFRAME.DLL”、“c:\windows\system32\IEFRAME.DLL” " 在此文件子树中。

和错误信息:

错误:未找到至少一个必需的隐式或转发依赖项。 错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。 警告:至少没有找到一个延迟加载依赖模块。 警告:由于延迟加载依赖模块中缺少导出功能,至少有一个模块存在未解析的导入。

接下来我从 Visual Studio 安装中复制了“MSVCR80.DLL”和“MSVCR90D.DLL”文件:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Microsoft.VC90.DebugCRT

和 C:\Program Files (x86)\Microsoft Visual Studio 8\VC\redist\amd64\Microsoft.VC80.CRT

“MSVCR80.DLL”的文件版本是“8.0.50727.42”,“MSVCR90D.DLL”的文件版本是“9.0.21022.8”。

embed.manifest 文件信息为: type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"

我对visual studio和dll文件有点了解,所以我真的需要你的帮助。

【问题讨论】:

  • 您已经混合了来自不同版本 Visual Studio 的发布和调试 DLL。确保使用相同版本的 VS 在发布或调试中构建所有内容。这包括依赖项。
  • 您的意思是我必须使用Visual Studio 2005 编译项目吗?如果我使用 Visual Studio 2008,我需要仅存在于 Visual Studio 2005 安装文件夹中的“MSVCR80.DLL”。为什么程序在 Visual Studio 2008 中编译时需要 MSVCR80.DLL?
  • 我在我的电脑上搜索了“IESHIMS.DLL”,有不同大小的不同版本。我使用的是位于 "C:\Program Files\Internet Explorer" 中的版本,是真的吗?
  • 很可能你的项目所依赖的东西(你是否链接到某个东西?)是使用 Visual Studio 2005 构建的。这会产生对 VS 2005 相关 DLL 的依赖。确保您使用的所有内容(包括依赖项)都是使用相同的 VS 版本构建的。现在不用担心 IESHIMS.DLL。 Dependency Walker 有时会给您带来误报。
  • 快速浏览一下项目,似乎对 Matlab 库有依赖?他们为什么版本的 Visual Studio 编译?您很可能会在 Matlab 的文档中找到它...

标签: visual-studio dll cuda 32bit-64bit mex


【解决方案1】:

我发现该错误可能与缺少 dll 无关。 MATLAB 错误是“无效的 mex 文件”。当错误消息是:“找不到指定的“模块””时,原因是缺少 dll。但是当错误信息是:'找不到指定的“程序”'时,问题可能不同

【讨论】:

  • 您能否更具体地了解缺少 procedure 错误的不同问题?
【解决方案2】:

我遇到了同样的问题。解决问题是一个奇怪的、很难看到的问题。

转到项目 > 属性。选择配置属性 > 链接器 > 高级,如下图所示。然后在显示“目标机器”的地方将设置从“未设置”更改为 MachineX64 (/Machine:X64),如图所示。我花了一段时间才弄清楚这一点,从那以后我就成功地从 Visual Studio 编译了 mex+cuda 文件。希望这也可以为您解决问题。

【讨论】:

  • 非常感谢您的回答,但我已经设置了“Machine:X64”选项,这不是问题。
  • 为了第二次澄清,您在链接器下设置了 Machine:X64?如果你已经这样做了,你介意压缩你的项目以便我看看我能做什么吗?
猜你喜欢
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 2013-05-18
相关资源
最近更新 更多