如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章
linux下intel的mkl编程代码,怎么样编译。C++和C语言代码
如何将 C++ dll 静态链接到 .NET 库(将 c++ dll 构建到网络包装器 dll 以获取一个 dll)