解决 Rstudio 中的 openssl 安装错误

Bri*_*ray 6 macos openssl r

抱歉,这篇文章冗长;请参阅最后的 tl;dr。

\n

我运行的是 macOS Catalina。我正在尝试在 Rstudio (1.3.1093) 中运行的 R (4.0.3) 中安装一些软件包,但我一直在两个不同的错误之间摇摆,这两个错误都与 openssl 有关。

\n

我知道R想要安装的openssl是同名系统库的包装器。当我尝试在 Rstudio 中安装 openssl 时,出现以下错误:

\n
Found pkg-config cflags and libs!\nUsing PKG_CFLAGS=-I/usr/local/include\n--------------------------- [ANTICONF] --------------------------------\\\nConfiguration failed because openssl was not found. Try installing:\\\n \\* deb: libssl-dev (Debian, Ubuntu, etc)\\\n \\* rpm: openssl-devel (Fedora, CentOS, RHEL)\\\n \\* csw: libssl_dev (Solaris)\\\n \\* brew: openssl@1.1 (Mac OSX)\\\nIf openssl is already installed, check that 'pkg-config' is in your\\\nPATH and PKG_CONFIG_PATH contains a openssl.pc file. If pkg-config\\\nis unavailable you can set INCLUDE_DIR and LIB_DIR manually via:\\\nR CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...'\\\n-------------------------- [ERROR MESSAGE] ---------------------------\\\ntools/version.c:1:10: fatal error: 'openssl/opensslv.h' file not found\\\n#include <openssl/opensslv.h>\\\n1 error generated. \n
Run Code Online (Sandbox Code Playgroud)\n

这很奇怪,因为当我进入终端并运行 \\

\n
which openssl\n
Run Code Online (Sandbox Code Playgroud)\n

我明白了

\n
\n

/usr/bin/openssl

\n
\n

当我跑步时,也在终端中,

\n
locate opensslv.h\n
Run Code Online (Sandbox Code Playgroud)\n

退回的物品之一是

\n
\n

/usr/local/include/openssl/opensslv.h

\n
\n

尽管事实证明这是一个软链接,指向我删除的内容。好的,所以我更改软链接并让它指向系统上其他位置的另一个 openssl/opensslv.h 文件(我的系统上肯定有很多 openssl 软件包,主要与 Rails 或 anaconda 有关)。之后我尝试跑步

\n
install.packages("openssl")\n
Run Code Online (Sandbox Code Playgroud)\n

在 Rstudio 中,这次我收到一个新错误:

\n
Error: package or namespace load failed for \xe2\x80\x98openssl\xe2\x80\x99 in dyn.load(file, DLLpath = DLLpath, ...):\\\n unable to load shared object '/usr/local/lib/R/4.0/site-library/00LOCK-openssl/00new/openssl/libs/openssl.so':\\\n  dlopen(/usr/local/lib/R/4.0/site-library/00LOCK-openssl/00new/openssl/libs/openssl.so, 6): Symbol not found: _EVP_PKEY_get_raw_private_key\\\n  Referenced from: /usr/local/lib/R/4.0/site-library/00LOCK-openssl/00new/openssl/libs/openssl.so\\\n  Expected in: flat namespace\\\n in /usr/local/lib/R/4.0/site-library/00LOCK-openssl/00new/openssl/libs/openssl.so\\\nError: loading failed\\\nExecution halted\n
Run Code Online (Sandbox Code Playgroud)\n

如果我通过使用brew安装openssl并更改opensslv.h软链接以指向brew安装的openssl.h来做更明智的事情,那么在R中安装openssl时会遇到相同的错误(无论是在Rstudio中还是在Rstudio中运行R)终端)

\n

根据我在线阅读的内容,最后一个 R 错误(包 r 命名空间加载失败)与我的系统上的多个 openssl 版本有关。是的,我的系统有大量的 openssl 版本(使用locate 和 grep 显示我的系统上有 212 个 openssl 副本),但其中绝大多数来自 anaconda、ruby 或 node,并且是唯一一个看起来它在我的 PATH 中是 /usr/bin/openssl,顺便说一句,它在更高版本的 macOS 上是只读的。

\n

所以我的问题是 A)我的 PATH 中是否有太多版本的 openssl B)如何找到它们?

\n

请不要评判我的系统管理;我一直在做愚蠢的事情试图安装这些 R 软件包,现在我担心我已经挖了一个太深的洞而无法爬出来!

\n

tl;dr:如果我在 macOS 的 PATH 中安装了多个版本的系统库(例如 openssl),我如何找到它们的位置?也许类似于linux的

\n
ldconfig -p|grep openssl\n
Run Code Online (Sandbox Code Playgroud)\n

jar*_*rot 7

要在终端中找到brew openssl use echo $(brew --prefix openssl),请在 ~/.R/Makevars 文件中添加两行以及输出,例如,如果命令的输出是 /usr/local/opt/openssl@1.1,请添加

LDFLAGS=-L/usr/local/opt/openssl@1.1/lib
CPPFLAGS=-I/usr/local/opt/openssl@1.1/include
Run Code Online (Sandbox Code Playgroud)

到您的 ~/.R/Makevars 文件。

要在 macOS Big Sur 中从源代码编译软件包,请参阅此处的说明

  • **注意::**`echo $(brew --prefix openssl)` 对我来说会产生 `/opt/homebrew/opt/openssl@3`,但我仍然使用 `openssl@1.1` 而不是 `opensssl@3`在我的 Makevars 文件中 (2认同)