我正在使用Julia 1.0.0和R 3.5.1,并且遇到一个问题,同时使用JuliaCall
和XRJulia
从R / RStudio调用Julia。
当我尝试:
library(JuliaCall)
julia <- julia_setup(JULIA_HOME = "C:\\Program Files\\Julia-1.0.0\\bin")
找到Julia版本,但是弹出错误消息,提示“缺少libgcc_s_seh-1.dll”
当我尝试时:
library(XRJulia)
JULIA_BIN <- "C:\\Program Files\\Julia-1.0.0\\bin"
findJulia(test=TRUE)
测试返回false。
但是,当我使用RCall
从Julia中调用R时,Julia可以找到并使用R(使用Atom / Juno IDE)。 Julia和R都位于C:\ Program Files路径中。
从R / RStuio呼叫Julia的正确方法是什么?
我向here寻找了解决方案,但无法使其正常工作。
更新-我尝试了此解决方案,以便R可以识别Julia文件的位置。当我重新启动会话并设置新的环境,然后尝试在我的R会话下面运行代码时,异常终止
Sys.setenv(PATH = paste(Sys.getenv("PATH"),"C:\\Program Files\\Julia-1.0.0\\bin",sep=";"))
library(JuliaCall)
julia <- julia_setup(JULIA_HOME = "C:\\Program Files\\Julia-1.0.0\\bin")
答案 0 :(得分:1)
(这是有关Julia的dll问题的更一般性建议。如果安装了R,我将尝试确切的情况。)
SetDllDirectory
问题我遇到了类似的问题,PyInstaller调用了另一种语言。最终与PyInstaller中对SetDllDirectory
的调用有关,该调用以一种奇怪的方式修改了搜索路径。
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectorya
https://github.com/pyinstaller/pyinstaller/wiki/Recipe-subprocess#windows-dll-loading-order
要修复此问题,我只需要告诉python将SetDllDirectory
重置回NULL
。我不确定R中的等效项。
调试正在加载的dll时,我非常喜欢SysInternals提供的此工具。下载它,然后在ListDlls.exe julia
或ListDlls.exe R
运行时用julia
或R
运行它。
https://docs.microsoft.com/en-us/sysinternals/downloads/listdlls
dyn.load
文档听起来,如果您加载了第三方dll,尤其是在Windows上,R会尝试做很多事情来查找dll。
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/dyn.load
“用于加载DLL的标准机制”包括针对以下内容的搜索顺序: 找到DLL的位置(如果未提供绝对路径,则为 首选),以及将在哪里找到其依赖的DLL。此搜寻 路径取决于Windows的版本及其安全设置,但是 对于Windows XP SP1以后的版本,则为
启动应用程序的目录。
各种系统目录,例如
c:/Windows/system32
,c:/Windows/system
和c:/Windows
。当前目录。
沿着环境给出的可执行文件的搜索路径 变量
PATH
。软件包通常希望在其
libs
目录中提供依赖的DLL, 然后通过设置PATH
变量({{1} 在R的最新版本中自动生成),但DLL搜索顺序表示 启动目录和系统目录中的DLL将是 首选。在Windows XP SP1和更高版本上,有一种方法可以修改 搜索顺序。如果将参数library.dynam
提供给DLLpath
,则后者 利用Windows系统调用dyn.load
插入SetDllDirectory
的值排在第二位,并删除当前目录, 在该DLLpath
通话期间。 (请注意,只有一个目录 可以通过这种方式插入。)用户对类似这样的消息感到困惑
dyn.load
最后一行是Windows(不是 R)诊断:找不到的“模块”不是
error: unable to load shared object '.../library/rJava/libs/x64/rJava.dll': LoadLibrary failure: The specified module could not be found.
但是Windows正在寻找其他东西(这里很可能是Java DLL):如果幸运的话,将出现一个包含更多详细信息的对话框。
Julia 1.x当前从exe所在的文件夹rJava.dll
中加载一些dll,并且还从附近的文件夹bin/
中加载sys.dll
。您可以通过在调用julia时用../lib/julia/sys.dll
参数指定sys.dll
所在的位置来覆盖它。
希望有帮助。