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