linux 在带有R 4.2.0和cmake 3.23.1的debian 9上安装nloptr 2.0.0时出现问题

pes8fvy9  于 2023-03-01  发布在  Linux
关注(0)|答案(2)|浏览(214)

在我的计算机debian 9(stretch)上,我已经从源代码安装了R4.2.0。我使用以下语法安装nloptr 2.0.0时遇到问题:
if (!require("nloptr", quietly = TRUE)) BiocManager::install("nloptr")
我得到的错误是:

/opt/R/4.2.0/lib/R/etc/Makeconf:177: recipe for target 'test-C-API.o' failed
make: *** [test-C-API.o] Error 1
ERROR: compilation failed for package ‘nloptr’
* removing ‘/home/ezop/R/x86_64-pc-linux-gnu-library/4.2/nloptr’

The downloaded source packages are in
    ‘/tmp/Rtmpqk35gk/downloaded_packages’
Warning message:
In install.packages(...) :
  installation of package ‘nloptr’ had non-zero exit status

我也试过通过复制我在网上找到的编译后的二进制文件来安装它,但后来我遇到了这个错误:

> library(nloptr)
Error: package or namespace load failed for ‘nloptr’ in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object '/home/ezop/R/x86_64-pc-linux-gnu-library/4.2/nloptr/libs/nloptr.so':
  /home/ezop/R/x86_64-pc-linux-gnu-library/4.2/nloptr/libs/nloptr.so: invalid ELF header

我已经检查了标题和机器信息,但我不知道下一步该怎么做:

base) root@kanta:/home/ezop/R/x86_64-pc-linux-gnu-library/4.2# file /home/ezop/R/x86_64-pc-linux-gnu-library/4.2/nloptr/libs/nloptr.so
/home/ezop/R/x86_64-pc-linux-gnu-library/4.2/nloptr/libs/nloptr.so: Mach-O 64-bit x86_64 dynamically linked shared library, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|WEAK_DEFINES|BINDS_TO_WEAK|NO_REEXPORTED_DYLIBS|HAS_TLV_DESCRIPTORS>
(base) root@kanta:/home/ezop/R/x86_64-pc-linux-gnu-library/4.2# uname -a
Linux kanta 4.9.0-18-amd64 #1 SMP Debian 4.9.303-1 (2022-03-07) x86_64 GNU/Linux
pgky5nke

pgky5nke1#

几分钟前我也遇到了同样的问题。我试着安装cmake和gfortran,但几乎没有成功。我注意到,当我最后一次尝试install.packages("nloptr")时,出现了以下错误消息:There are binary versions available but the source versions are later. Do you want to install from sources the package which needs compilation?.
珍妮·布莱恩解释说,一个简单的"不"就可以了。
我希望这对你也有用。

5lhxktic

5lhxktic2#

我刚刚在R版本4.1.1(2021-08-10)平台下偶然发现了这个同样的问题:x86_64-个人电脑-Linux-gnu(64位)
我的Linux系统上没有安装nlopt,但安装了cmake/3.17.3
因此,在安装nloptr_2.0.3期间

install.packages('nloptr')

我们看到pkg-config无法找到nlopt,因此它检查了cmake以从源代码重新生成nlopt:

checking for pkg-config... /usr/bin/pkg-config
checking if pkg-config knows NLopt... no    
checking for cmake... /software/cgeh/cmake/cmake-3.17.3/bin/cmake

错误为

make: *** [/software/cgeh/r/4.1.1/install/lib64/R/etc/Makeconf:177: test-C-API.o] Error 1
ERROR: compilation failed for package  nloptr

由于函数abs()的重载函数匹配不明确

test-C-API.cpp:107:35: error: call of overloaded   abs(__gnu_cxx::__alloc_traits<std::allocator<double> >::value_type) 
    is ambiguous expect_true(abs(res[0] - 1./ 3) < 1.0e-4);

如果您解压并解压缩源代码(nloptr.tar.gz)并查看文件src/test-C-API.cpp,您可以在上下文中看到对expect_true()的调用:

test_that("Test exposed NLopt C code using example from NLopt tutorial")
   {
     // Get optimal x values.
    std::vector<double> res = solve_example();

    // Check return value.
    expect_true(res.size() == 2);
    expect_true(abs(res[0] - 1./ 3) < 1.0e-4); 
    expect_true(abs(res[1] - 8./27) < 1.0e-4); 
  }
}

其中abs()的参数为“double”,但更仔细地查看R安装尝试中的错误消息,似乎abs()的唯一候选函数声明是针对输入类型int或long int,而不是“double”

/usr/include/stdlib.h:735:12: note: candidate: int abs(int)
/usr/include/c++/6.2.1/cstdlib:185:3: note: candidate: __int128 std::abs(__int128)
/usr/include/c++/6.2.1/cstdlib:180:3: note: candidate: long long int std::abs(long long int)
/usr/include/c++/6.2.1/cstdlib:172:3: note: candidate: long int std::abs(long int)

在我的例子中,所包含的库集合似乎不包括其中为浮点类型定义了abs()的库,例如cmath。在我的例子中,cmath位于/usr/include/c++/6.2.1/中,尽管将其包含在test-C-API. h中,作为

#include <cmath>

没有解决这个问题-我不熟悉Catch单元测试库或testthat()函数,所以不知道为什么这个修复尝试失败。也许其他人可以加入一个涉及cmath的替代修复。
我的工作是编辑test-C-API.cpp,注解掉最后test_that()中依赖于abs(double)的两行,从"expect_true(abs(res[..."开始,保存它,然后tar和gzip重新压缩整个目录树,然后使用这个本地 * 现在已编辑 * 文件安装:

install.packages("nloptr.tar.gz", repos = NULL, type="source")

安装按预期进行,我的测试R代码给了我想要的结果。我预计我的R代码不会有abs()的问题,只是他们用C++编写的单元测试是在我的系统设置下进行的。

相关问题