【问题标题】:java.lang.UnsatisfiedLinkError: no mkl_rt in java.library.pathjava.lang.UnsatisfiedLinkError:java.library.path 中没有 mkl_rt
【发布时间】:2020-06-29 01:19:29
【问题描述】:

我在 windows10 中有一个使用微笑库的 java8 应用程序。例如,当我运行 LLE 算法时,我收到了以下警告:

smile-netlib 模块在类路径中不可用。纯Java 矩阵库将被使用。 所以我决定通过 maven 添加微笑 ntelib,正如 github 中的微笑所建议的那样。但是再次运行后,我得到了这个堆栈跟踪:

java.lang.UnsatisfiedLinkError: no mkl_rt in java.library.path
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at smile.netlib.NLMatrix.<clinit>(NLMatrix.java:41)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at smile.math.matrix.Factory.<clinit>(Factory.java:39)
    at smile.math.matrix.Matrix.zeros(Matrix.java:98)
    at smile.manifold.LLE.<init>(LLE.java:155)
    at TestLLE.TestLLETetCase(TestLLE.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

1) mkl_rt 是什么,我如何在 java 中插入它?这意味着数学内核库? 2) 微笑还建议“让他们的机器优化 libblas3 (CBLAS) 和 liblapack3 (Fortran) 在运行时作为共享库可用。”我怎样才能做到这一点?

编辑:

我找到并下载了 mkl_rt.dll 并将它放在一个名为 dlls 的文件夹中。 我当前的问题是,通过在 java.library.path 中设置带有 mkl_rt 的文件夹,它会找到 dll,但找不到来自其他依赖项的函数。我在问题开始的smile-netlib中找到了这段代码。

JMatrix(蓝色)是来自smile.math.matrix 包中的smile-math jar 的一个类,所以当我通过vm 参数、以编程方式或通过本地位置的eclipse 添加路径时,dllsmile-netlib NLMatrix 类会找不到 JMatrix 类,它是smile-netlib,我收到以下错误。

java.lang.NoSuchMethodError: smile.math.matrix.Matrix.of([D)Lsmile/math/matrix/DenseMatrix;
at smile.netlib.LU.solve(LU.java:99)
at smile.manifold.LLE.<init>(LLE.java:180)
at TestLLE.TestLLETetCase(TestLLE.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

【问题讨论】:

    标签: java cblas liblas netlib smile


    【解决方案1】:

    您必须找到包含mkl_rt.dll 的文件夹,然后将该文件夹添加到系统属性java.library.path。这通常通过在启动时将选项 -Djava.library.path=/path/to/folder 传递给 JVM 来完成。

    mkl_rt.dll 包含在本机(非 Java)代码中的算法的有效实现。

    【讨论】:

    • 这个答案与我应该将 mkl_rt.dll 添加到 java 库路径的事实相差不远,但是当我这样做时,我的应用程序没有考虑到项目依赖项,所以我尝试找到与 dll 和 jar 库集成的最佳方式
    • 我真正的问题是,当我以编程方式或通过 Eclipse 添加 dll 的路径时。我的应用程序似乎没有“看到”我的依赖项
    • 我不确定剩下的问题是什么。我看不出将-Djava.library.path 添加到eclipse 配置中会如何损害依赖关系或JAR。也许你可以准确地展示你在做什么?还是 eclipse 用来启动 JVM 的命令行?在 Eclipse 中,如果您转到项目的运行配置并在“参数”选项卡上将 -Djava.library.path=... 添加到“VM 参数”框中,这还不足以让事情顺利进行吗?
    • 您发布的错误似乎与您引用的代码无关。回溯中没有 NLMatrix 类。无论如何,这似乎是一个不同的错误。也许修复 DLL 的问题让您更进一步,现在您面临一个新的不同的错误?
    • 是的,你是对的,我粘贴的代码是最初的错误,我没有提倡好。但我想说的是,好吧,我添加了 dll,为什么看不到我的依赖项中的方法。
    猜你喜欢
    • 2018-06-19
    • 2017-06-27
    • 2016-08-29
    • 2012-07-16
    • 2016-11-10
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多