如何将 MKL v9.x 静态链接到托管 C++ DLL 以计算 FFT?

Posted

技术标签:

【中文标题】如何将 MKL v9.x 静态链接到托管 C++ DLL 以计算 FFT?【英文标题】:How to statically-link MKL v9.x into a managed C++ DLL to calculate FFT? 【发布时间】:2010-12-06 15:35:35 【问题描述】:

我正在使用 C# 和 Visual Studio 2008 编写应用程序。我一直在阅读英特尔数学库附带的文档……以及一些论坛……但无法获得答案。

这是我所在的地方:

场景: 尝试使用 Visual Studio 2008 将 MKL v9.x 静态链接到托管 C++ DLL 以计算 FFT。

链接器命令: /OUT:"C:\Projects\Acquisition Toolkit\Mainline\Builds\Debug\AcquisitionToolkit.FFT.dll" /INCREMENTAL /NOLOGO /LIBPATH:"C:\Projects\Acquisition Toolkit\Mainline\Lib\Win32" /DLL /MANIFEST /MANIFESTFILE:"Debug\Win32\AcquisitionToolkit.FFT.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /ASSEMBLYDEBUG /PDB:"c:\Projects\Acquisition Toolkit\Mainline \Builds\Debug\AcquisitionToolkit.FFT.pdb" /DYNAMICBASE /FIXED:No /NXCOMPAT /MACHINE:X86 /KEYFILE:"AcquisitionToolkit.snk" /ERRORREPORT:PROMPT mkl_c.lib mkl_ia32.lib libguide40.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

链接时获取未解析的外部:

FFT.obj:警告 LNK4248:'DFTI_DFT_Desc_struct' 的未解析 typeref 令牌 (0100000E);图像可能无法运行

在运行时,它在调用 DftiCreateDescriptor 时崩溃,可能是因为它不知道描述符结构的格式:

// 创建 FFT 描述符 DFTI_DESCRIPTOR_HANDLE 描述; long val = DftiCreateDescriptor(&desc, DFTI_DOUBLE, DFTI_REAL, 1, 长度);

// 提交 FFT 描述符 DftiCommitDescriptor(desc); 我们包括 mkl_dfti.h 头文件。

是否有我们需要的其他头文件或需要链接的其他库?

描述符结构实际定义在哪里?

我尝试使用 mkl_c_dll.lib 进行动态链接,但收到相同的未解析外部链接器警告。

我还需要其他链接器选项吗?

如果有人可以给我一些指导/帮助,请。我真的很感激。

谢谢!!

【问题讨论】:

英特尔网页上不再有可用的 mkl 9。我确实安装了最新的 10.2 eval 并且链接它没有任何问题。 software.intel.com/en-us/articles/… 您应该只是缺少 C:\Program Files\Intel\MKL\9.x.x\ia32\lib 中的一些 .lib 文件。如果我是你,我会尝试链接文件夹中的所有 lib 文件 我知道 mkl9 已经过时了,但我被要求使用它。所以我无法安装最新的 10.2。 【参考方案1】:

据我所知,您只能使用 c++/clr 进行动态链接,即 /clr 与 /MT[d] 不兼容。您需要链接到使用 /MD[d] 编译的库,以便它们使用相同的运行时。我不知道为什么当您进行动态链接时它会失败,但您的错误描述符理论听起来是正确的

编辑:顺便说一句,我不知道这是否适合您的情况,但您可以使用 CUDA 在 GPU 上更快地执行 FFT(袖带)。

【讨论】:

以上是关于如何将 MKL v9.x 静态链接到托管 C++ DLL 以计算 FFT?的主要内容,如果未能解决你的问题,请参考以下文章

将静态本机库链接到托管 C++ 项目会在

linux下intel的mkl编程代码,怎么样编译。C++和C语言代码

如何重新导出 CLR c++ 静态库

如何将 C++ dll 静态链接到 .NET 库(将 c++ dll 构建到网络包装器 dll 以获取一个 dll)

在 Python-C++-C-Fortran 2003 程序中链接英特尔的 MKL

如何将托管 c++ 库导入 C# 应用程序(目标 .net 版本 3.5)