解决在Rstudio中安装openssl出现的错误

6
抱歉,本文较长,结尾处有tl;dr简介。
我的电脑运行的是macOS Catalina操作系统。我正在尝试在Rstudio(1.3.1093)中安装一些软件包,但是我一直在两个不同的错误之间徘徊,都与openssl有关。
我知道R想要安装的openssl是同名系统库的包装器。当我在Rstudio中尝试安装openssl时,会出现以下错误提示:
Found pkg-config cflags and libs!
Using PKG_CFLAGS=-I/usr/local/include
--------------------------- [ANTICONF] --------------------------------\
Configuration failed because openssl was not found. Try installing:\
 \* deb: libssl-dev (Debian, Ubuntu, etc)\
 \* rpm: openssl-devel (Fedora, CentOS, RHEL)\
 \* csw: libssl_dev (Solaris)\
 \* brew: openssl@1.1 (Mac OSX)\
If openssl is already installed, check that 'pkg-config' is in your\
PATH and PKG_CONFIG_PATH contains a openssl.pc file. If pkg-config\
is unavailable you can set INCLUDE_DIR and LIB_DIR manually via:\
R CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...'\
-------------------------- [ERROR MESSAGE] ---------------------------\
tools/version.c:1:10: fatal error: 'openssl/opensslv.h' file not found\
#include <openssl/opensslv.h>\
1 error generated. 

那很奇怪,因为当我去终端并运行\

which openssl

我得到了

/usr/bin/openssl

当我在终端中运行时,也是如此。

locate opensslv.h

返回的其中一项是:

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

实际上,这是一个软链接,指向我已删除的某些内容。好的,我更改了软链接,并让它指向系统中其他地方的另一个openssl/opensslv.h文件(我的系统上确实有很多openssl软件包,主要与rails或anaconda有关)。之后我尝试运行:

install.packages("openssl")

我在Rstudio中遇到一个新错误:

Error: package or namespace load failed for ‘openssl’ in dyn.load(file, DLLpath = DLLpath, ...):\
 unable to load shared object '/usr/local/lib/R/4.0/site-library/00LOCK-openssl/00new/openssl/libs/openssl.so':\
  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\
  Referenced from: /usr/local/lib/R/4.0/site-library/00LOCK-openssl/00new/openssl/libs/openssl.so\
  Expected in: flat namespace\
 in /usr/local/lib/R/4.0/site-library/00LOCK-openssl/00new/openssl/libs/openssl.so\
Error: loading failed\
Execution halted

如果我更明智地使用brew安装openssl并将opensslv.h软链接更改为指向由brew安装的opensslv.h,则在安装R中的openssl时,无论是在Rstudio中还是通过终端运行R,在进行更加合理的操作时也会出现相同的错误。
根据我在线阅读的内容,最后一个R错误(r名称空间加载失败)与我的系统上有多个openssl版本有关。 是的,我的系统上有大量的openssl版本(使用locate和grep显示我有212个openssl副本),但其中绝大多数来自anaconda、ruby或node,而看起来路径下唯一的一个是/usr/bin/openssl, 顺便说一下,这是macOS较新版本上的只读文件。
因此,我的问题是A)我的PATH中是否有太多版本的openssl,B)如何找到它们所有的位置?
请不要评判我的系统管理; 我在尝试安装这些R软件包时做了愚蠢的事情,现在我担心我已经挖了一个太深的洞,无法爬出来!
简而言之:如果我的macOS PATH中安装了多个系统库(例如openssl)的版本,如何找到它们所有的位置? 类似于linux的某些东西。
ldconfig -p|grep openssl

1
嗨@Brian-Wray,希望你现在已经解决了这个问题,但如果你想定位brew openssl,请在终端中尝试echo $(brew --prefix openssl),然后将输出添加到您的~/.R/Makevars文件中的两行,例如(如果命令的输出是/usr/local/opt/openssl@1.1),请在Makevars文件中分别添加LDFLAGS=-L/usr/local/opt/openssl@1.1/libCPPFLAGS=-I/usr/local/opt/openssl@1.1/include。要在macOS Big Sur中从源代码编译软件包,请参见我的说明:https://dev59.com/Z1EG5IYBdhLWcg3wfPPB#65334247 - jared_mamrot
2
亲爱的@jared_mamrot,非常感谢您在这里给我的建议。在运行了echo命令并将两行代码添加到~/.R/Makevars后,我成功地安装了我一直苦苦挣扎的软件包。在R studio中使用简单的install.packages命令即可为我完成安装,无需从源代码编译。如果我有两个赞可以给,我会很乐意这样做! - Brian Wray
很高兴你解决了问题!我会把我的评论转化为一个答案,你可以接受它。 - jared_mamrot
1个回答

7

要找到 brew openssl,请在终端中使用 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

将以下内容添加到您的~/.R/Makevars文件中。

若要在macOS Big Sur上从源代码编译软件包,请查看我的说明此处


我该如何访问~/.R/Makevars文件?我找不到它。 - user2746087
如果您在~/.R目录中没有名为“Makevars”的文件,您可以创建一个(例如:echo LDFLAGS=-L/usr/local/opt/openssl@1.1/lib > ~/.R/Makevars && echo CPPFLAGS=-I/usr/local/opt/openssl@1.1/include >> ~/.R/Makevars)。 - jared_mamrot
好的,我运行了这些命令并创建了一个包含这些行的文件。然而,再次运行代码时出现了相同的错误:警告:dyn.load 中的错误:无法加载共享对象'/Library/Frameworks/R.framework/Versions/3.5/Resources/library/openssl/libs/openssl.so': 原因:找不到图像 [无堆栈跟踪可用]为了背景,这是一个闪亮的应用程序。当一段代码尝试连接mongodb以写入数据时,似乎触发了该错误。运行 echo $(brew --prefix openssl) 给出了 /usr/local/opt/openssl@1.1。有什么想法吗?谢谢。 - user2746087
如果您需要故障排除的帮助,我已经在聊天室中创建了一个房间(https://chat.stackoverflow.com/rooms/232622/troubleshoot-openssl-issues)。 - jared_mamrot
2
注意:对我来说,echo $(brew --prefix openssl)返回/opt/homebrew/opt/openssl@3,但我仍然在我的Makevars文件中使用openssl@1.1而不是opensssl@3 - alexwhitworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接