在Linux上安装nloptr

30

我正在尝试在没有网络连接的CentOS Linux机器上安装R包nloptr,步骤如下:

install.packages("/home/ravi/nloptr_1.0.4.tar.gz", repos = NULL, type="source")

这条命令会在线寻找以下文件。
http://ab-initio.mit.edu/nlopt/nlopt-2.4.2.tar.gz

然而,由于机器没有网络连接,因此这种方法失败了。
我尝试了以下stackoverflow帖子中的建议: 在Ubuntu上本地安装nloptr时出现问题 我按照以下方式更改了configure和configure.ac文件中的URL:
NLOPT_URL="file:///home//ravi//${NLOPT_TGZ}"

然而,当我再次尝试安装该软件包时,出现了以下错误:
> install.packages("/home/ravi/nloptr_1.0.4.tar.gz", repos = NULL, type="source")
* installing *source* package 'nloptr' ...
files 'configure', 'configure.ac' have the wrong MD5 checksums
ERROR: 'configure' exists but is not executable -- see the 'R Installation and Administration Manual'
* removing '/opt/vertica/R/library/nloptr'
Warning message:
In install.packages("/home/ravi/nloptr_1.0.4.tar.gz",  :
  installation of package '/home/ravi/nloptr_1.0.4.tar.gz' had non-zero exit status

有人能指导我如何本地安装这个R包吗?

更新1

根据Dirk的建议,我按照以下页面中给出的说明先安装了nlopt:

http://ab-initio.mit.edu/wiki/index.php/NLopt_Installation

我按照以下方式安装了nlopt:

./configure --enable-shared
make
make install
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib

当我尝试在R中重新安装nloptr时,它不再寻找nlopt链接,而是抛出以下错误:
Error in dyn.load(file, DLLpath = DLLpath, ...) :
  unable to load shared object '/opt/vertica/R/library/nloptr/libs/nloptr.so':
  /opt/vertica/R/library/nloptr/libs/nloptr.so: undefined symbol:   nlopt_set_maxtime
Error: loading failed
Execution halted
ERROR: loading failed
* removing '/opt/vertica/R/library/nloptr'
Warning message:
In install.packages("/home/ravi/nloptr_1.0.4.tar.gz",  :
  installation of package '/home/ravi/nloptr_1.0.4.tar.gz' had non-zero exit     status

更新2

根据Dirk的建议,我研究了ldconfig命令,并使用了以下参考资料:

http://codeyarns.com/2014/01/14/how-to-add-library-directory-to-ldconfig-cache/

我编辑了/etc/ld.so.conf文件,添加了包含共享库的目录/usr/local/lib,并运行了ldconfig命令。这将相关的共享库添加如下所示:
libnlopt.so.0 (libc6,x86-64) => /usr/local/lib/libnlopt.so.0
libnlopt.so (libc6,x86-64) => /usr/local/lib/libnlopt.so

然而,当我尝试重新安装nloptr包时,仍然会出现相同的共享对象错误。
有人能指导我解决共享库错误吗?
8个回答

34
当你说“这个命令依次在线查找以下文件”时,你只知道一半的内容。与实际nloptr包的维护者Jelmer一起,我修改了该包以执行以下操作:
  • 查找安装libnlopt库,并在找到后使用它
  • 如果未找到,则退回到旧行为并下载库
因此,您可以通过简单的方式安装nlopt:
 sudo apt-get install libnlopt-dev

或者使用相当于从 USB 驱动器等位置指向文件的sudo dpkg -i /media/....,然后重新安装nloptr软件包。它会正常工作。在我的机器上:
edd@max:~$ install.r nloptr         ## install.r is in littler
trying URL 'http://cran.rstudio.com/src/contrib/nloptr_1.0.4.tar.gz'
Content type 'application/x-gzip' length 353942 bytes (345 KB)
==================================================
downloaded 345 KB

* installing *source* package ‘nloptr’ ...
** package ‘nloptr’ successfully unpacked and MD5 sums checked
checking for g++... g++
checking whether the C++ compiler works... yes
checking for C++ compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking how to run the C++ preprocessor... g++ -E
checking whether we are using the GNU C++ compiler... (cached) yes
checking whether g++ accepts -g... (cached) yes
checking for pkg-config... yes
configure: Now testing for NLopt header file.
[...]
checking for nlopt.h... yes
configure: Suitable NLopt library found.
configure: creating ./config.status
config.status: creating src/Makevars
** libs
g++ -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -O3 -Wall -pipe -Wno-unused -pedantic  -c dummy.cpp -o dummy.o
gcc -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -O3 -Wall -pipe -pedantic -std=gnu99 -c nloptr.c -o nloptr.o
g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o nloptr.so dummy.o nloptr.o -lnlopt -lm -L/usr/lib/R/lib -lR
installing to /usr/local/lib/R/site-library/nloptr/libs
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** installing vignettes
** testing if installed package can be loaded
* DONE (nloptr)

The downloaded source packages are in
        ‘/tmp/downloaded_packages’
edd@max:~$ 

请注意,它只编译了两个文件,这些文件来自于实际的R包,并找到了nlopt安装。

嗨,Dirk,我的机器上既没有apt-get也没有dpkg安装。还有其他方法吗? - Ravi
当然。那么你的问题要么完全解决了,要么你完全困惑了,因为你 不太可能在 Ubuntu 机器上。安装 nlopt 仍然会有帮助:如果找到 nlopt 则使用 的行为是你正在尝试安装的 CRAN 包的特性。 - Dirk Eddelbuettel
你似乎在非标准位置安装了一个共享库。请搜索StackOverflow(或通过Google)查找“ldconfig”和“ld.so.conf”。现在,您正在处理如何从非标准路径使用本地安装的库的问题。 - Dirk Eddelbuettel
Dirk,我尝试了ldconfig命令并发布了更新2。但是当我安装R包时仍然会出现相同的共享对象错误。 - Ravi
1
如果有一个叫做nlopt-dev的东西,你也需要它。与nlopt运行不同的是,构建和链接它。 - Dirk Eddelbuettel
显示剩余3条评论

13

我在Ubuntu上遇到了类似的问题。除了按照Dirk的回答安装nlopt-dev之外,我还需要安装pkg-config:

sudo apt-get install pkg-config

希望这能有所帮助。


这个对我也解决了,尝试一下再去折腾其他的东西。 - Cookie

13

我曾经在一台没有直接互联网访问权限的 Red Hat Enterprise Linux Server release 6.6 (Santiago) 生产机上遇到了完全相同的问题。以上提出的解决方法都不起作用: 在系统上安装了 nlopt 库后,尝试安装 nloptr 时失败并出现“nlopt_set_maxtime”错误。我试图调整 nlopt 的编译选项,但结果毫无效果。我甚至在一台有互联网连接的 Ubuntu 机器上重现了这个问题: 我卸载了 nloptr,将 nlopt 安装到系统中,然后 nloptr 的安装失败了。

最后,我采取了以下步骤解决了这个问题:

  1. 从操作系统中卸载 nlopt(确保它被彻底删除)。
  2. 手动下载 nlopt-2.4.2.tar.gz 并将其复制到 /tmp/。
  3. 手动下载 nloptr_1.0.4.tar.gz 到一个工作目录并解压它; 这将创建一个名为“nloptr/”的目录。
  4. 编辑 "nloptr/configure",注释掉以下行

    $("${R_HOME}/bin/Rscript" --vanilla -e "download.file(url='${NLOPT_URL}', destfile='${NLOPT_TGZ}')")

    并插入一行新代码:

    $("${R_HOME}/bin/Rscript" --vanilla -e "file.copy(from='/tmp/nlopt-2.4.2.tar.gz', to='${NLOPT_TGZ}')")

  5. 使用 "R CMD INSTALL nloptr" 命令进行安装。


嗨..即使在nloptr的配置脚本中进行了上述更改并重新创建了tar.gz文件,我仍然会收到相同的错误提示:“无法加载共享对象'/usr/lib64/RRO-8.0.2/R-3.1.2/lib64/R/library/nloptr/libs/nloptr.so':” - myloginid
我没有重新创建.tar.gz文件:我直接从解压原始.tar.gz的目录“nloptr/”中安装,然后修改了“nloptr/configure”文件。虽然不确定这样做是否会有所不同... - renato vitolo
同意。但是同样的方法也不起作用。我这样做是因为R通常要求我们提供.tar.gz文件,而我不确定没有它是否能正常工作。我的基础设施团队不允许直接连接到互联网。 - myloginid
我在想,您是否在尝试上述过程之前完全卸载了手动安装的nloptr和任何其他版本?使用“干净”的机器,我看不出失败的原因... - renato vitolo
1
只要我在提取的 nlopt/ 文件夹中执行了 make uninstall,这对我起作用。完全删除 nlopt 后,我能够运行上述命令并使其正常工作。 - Mark Nielsen
显示剩余3条评论

9

如果您正在使用CentOS操作系统(并且有互联网访问权限,但是无法访问nlopt服务器),可以先安装nlopt

yum install nlopt nlopt-devel

然后你可以正常安装nloptr


谢谢...问题是你仍然得到 v. 2.4 ... 需要类似 factoextra 的软件包的最低版本为 v. >= 2.7 ... 有没有获取更高版本的想法? - jjrr

3
我在我的RHEL 7.2实例上安装nloptr时遇到了相同的问题。 对于那些使用RHEL的人,您可以按照以下步骤执行: 按顺序下载并安装以下RPM:
- NLopt-2.4.2-2.el7.x86_64.rpm - https://pkgs.org/centos-7/epel-x86_64/NLopt-2.4.2-2.el7.x86_64.rpm.html - NLopt-devel-2.4.2-2.el7.x86_64.rpm - https://pkgs.org/centos-7/epel-x86_64/NLopt-devel-2.4.2-2.el7.x86_64.rpm.htm 请注意,这些RPM可能需要根据您的系统配置安装其他依赖项。
完成后,您可以直接使用install.packages工具安装nloptr,或者从CRAN下载源代码并按先前响应中建议的方式安装。
希望这可以帮助您! Kiran

0

我在我的服务器上通过以下两个步骤解决了这个问题:

  1. 使用以下命令安装libnlopt-devnlopt
sudo apt-get install libnlopt-dev
pip install nlopt

使用sudo R启动R并输入以下命令:
withr::with_makevars(c(PKG_LIBS='-lnlopt'),install.packages('nloptr'),assignment='+=')

为什么需要使用 sudo 进行此操作? - flies
也许不是必须的,上次我使用了 sudo R 来安装 png 包。在那种情况下,如果没有使用 sudo,我无法安装 png - Deku
在安装库时,以超级用户身份安装可能会导致混乱和可能的依赖关系问题。当从控制台运行install.packages时,它将作为用户执行,因此,除非您非常注意从正常的“工作会话”中安装,否则您将拥有一些属于超级用户的库和一些不属于超级用户的库的混乱网络。当用户安装需要更新超级用户已安装的库的更新版本的新库时会发生什么? - flies

0

如果您正在使用AWS Linux,以下内容应该会有所帮助

yum --enablerepo=epel install NLopt-devel -y

-2

我认为我和你有同样的问题,我正在使用CentOS 6.5。 在R中使用install.packages()删除nlopt并安装nloptr,nlopt将自动安装。

我使用以下命令在未压缩的nlopt文件夹中删除已安装的nlopt。

make uninstall 

如果您曾尝试在CentOS中使用epel仓库并使用yum安装nlopt,请尝试:
yum remove nlopt

移除已有的nlopt后,我能够安装nloptr

install.packages("nloptr")

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