我对ILNUmerics非常感兴趣,想尝试免费版本,但我遇到了麻烦。
我已经开始使用控制台应用程序并尝试运行'hello ilnumerics'console应用程序,但我注意到VS无法找到MKL库。
我在Windwos 8下使用VS2012(2010年中期在MacBook Pro上通过Bootcamp;它是否相关);我已从Project解决方案中安装了NuGet Packages扩展。然后右键单击解决方案资源管理器中的引用,“管理Nu获取包”,在线/搜索各种版本的ilnumerics。我选择'ILNumerics'并安装。我将'ILNumerics'和'ILNumerics.Native'添加到我的项目中。然后我可以在解决方案资源管理器中的“引用”下看到ILNumerics并获得两个新文件夹/ bin32 /和/ bin64 /它们都包含两个名为libiomp5md.dll和mkl_custom.dll的DLL。我检查了他们的 “复制到输出目录”属性,它们都设置为“如果更新则复制”。
显然找不到mkl_custom。我编写了以下代码,取自快速入门指南:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ILNumerics;
namespace ConsoleApplication3
{
class Program : ILMath
{
static void Main(string[] args)
{
ILArray<double> A = array<double>
(new double[] { 1,1,1,1,1,2,3,4,1,3,6,10,1,4,10,20} ,4, 4);
ILArray<double> B = counter(4, 2);
ILArray<double> Result = linsolve(A, B);
Console.Out.WriteLine("A: " + Environment.NewLine +
A.ToString());
Console.Out.WriteLine("B: " + Environment.NewLine + B.ToString());
Console.ReadKey();
}
}
}
我得到了这个例外: ILNumerics.dll中出现未处理的“System.DllNotFoundException”类型异常
其他信息:无法加载DLL'mkl_custom':找不到指定的模块。 (HRESULT异常:0x8007007E)
如果我不调用linsolve,ILArray的ToString方法确实有效:如果我发表评论// ILArray Result = linsolve(A,B);
我在屏幕上打印了两个矩阵。
我还尝试计算矩阵的行列式并获得相同的异常:显然,任何时候我调用mkl_custom VS都无法找到它。
请帮忙/提示吗?
此外,是否有必要在添加到解决方案的任何项目中通过NuGet安装ILNumerics?是否可以在本地安装一次,然后在必要时添加引用?
答案 0 :(得分:3)
两个选项:
1)确保所有二进制文件都可以按预期访问:ILNumerics使用AnyCPU目标并通过在启动时将“bin32”/“bin64”目录添加到PATH envoronment变量来选择平台dependend子文件夹。您的机器可能会出现故障?您可以通过手动将正确的二进制文件(取决于您的平台)直接放入输出路径来确保。
2)如果错误仍然存在:mkl_custom.dll依赖于其他一些dll本身。一个(libiomp5md.dll)随ILNumerics nuget包一起提供。其他人应该存在于您的系统上:KERNEL32.DLL和MSVCR110.DLL。确保你有这些!如果内核dll丢失 - &gt;称之为奇迹并重新安装您的系统。如果缺少msvcr110 - &gt;转到here并安装“Visual C ++ Redistributable for Visual Studio 2012”。
如果问题仍然存在,您可能会在ILNumerics bugtracker上提交错误,因为运行时应该在那里,正如您所写,您使用的是VS2012。可能这是一个版本问题。
编辑:从版本4.0开始,ILNumerics不再在bin32 / bin64 /子文件夹中部署本机二进制文件,而是将系统范围内的所有本机依赖项安装到GAC和System32 / WOW文件夹中。旧方案仍然有效(为了与旧项目兼容)。但是,没有必要明确地处理ILNumerics的任何依赖性。它们应该只是在运行时找到。答案 1 :(得分:0)
就像number303所说,ILNumerics.dll无法找到所需的依赖项。您可以通过将所需的DLL复制到与ILNumerics.dll相同的目录作为后期构建步骤来强制修复此依赖关系,但我认为这是一个更优雅的解决方案。
默认情况下,使用x86配置创建VS2010 .NET控制台解决方案。编译并运行ILNumerics示例Hello ILNumerics!使用此配置的代码会导致DLL找不到异常(mkl_custom.dll)。
通过配置管理器将解决方案重新定位到“任何CPU”为我解决了问题: 在解决方案资源管理器中,右键单击解决方案并选择属性。选择Configuration Properties,然后单击右上角的Configuration Manager ...按钮。确保使用ILNumerics的项目选择了“任何CPU”。如果“任何CPU”无法作为选择,请从下拉列表中选择“”并根据您当前的平台创建“任何CPU”平台。通常这只是意味着接受“新建项目平台”对话框中的默认值。您可能还想修改“Active solution platform:”以包含“Any CPU”目标。
重构/运行。
答案 2 :(得分:0)
在我的情况下,它帮助安装了“Visual C ++ Redistributable for Visual Studio 2012”,尽管我使用Visual Studio 2010并安装了相应的“Visual C ++ Redistributable for Visual Studio 2010”。只要不需要mkl_custom.dll,哪个工作正常。但是如果没有安装2012 Redistributable,我的同事就不会遇到这个问题。