【发布时间】:2015-02-01 12:35:37
【问题描述】:
我已经编写并构建了一个依赖于Rcpp 并需要C++0x 标准的R 包(用于在C++ 中使用tgamma 函数)。我已经在各种台式计算机和操作系统上测试了该软件包,它似乎总是可以正常安装和工作。但是,我也想在 HPC 服务器上使用该软件包。当我尝试使用R CMD INSTALL test(其中test 是包的名称)在本地R 库树中安装包时,我从编译器收到以下错误消息:
/usr/include/c++/4.4.7/c++0x_warning.h(31):灾难性错误:#error 指令:此文件需要编译器和库支持即将推出的 ISO C++ 标准 C++0x。此支持目前是实验性的,必须使用 -std=c++0x 或 -std=gnu++0x 编译器选项启用。 #error 此文件需要编译器和库支持,以支持即将推出的 \ ^
Metropolis_Sampler_Beta_Edgewise_Cpp_Statistics.cpp 的编译中止(代码 4) 制作:*** [Metropolis_Sampler_Beta_Edgewise_Cpp_Statistics.o] 错误 4 错误:包“test”编译失败
它基本上告诉我应该在调用编译器时启用 C++0x 支持(如this 帖子中所示)。然而,我认为将声明 CXX_STD = CXX11 添加到 R 包中的 src/Makevars 文件实际上会告诉编译器需要使用此版本。实际上,在我尝试过的各种台式计算机上似乎就是这种情况。所以我的问题是:如何告诉服务器上的编译器这个 C++ 版本应该用于编译?或者,我还能如何安装包?
在服务器上,我在尝试安装包之前通过在终端上输入module load math/R 为 R 加载模块,它报告以下模块已加载:
加载模块依赖'compiler/intel/13.1'。
正在加载模块依赖 'numlib/mkl/11.0.5'。
编辑 1:服务器是一个名为 bwUniCluster 的德国大学集群。它基于 KITE 2.0/RHEL6.5/Lustre 2.5.2。据我从上面报告的模块消息中可以看出,它似乎是 Intel C++ Compiler XE (ICPC) 版本 13.1.3。但实际上我对编译器一无所知,所以如果您需要了解更具体的内容,请告诉我。
Edit 2 在我尝试安装包之前,也可以在终端上执行module load compiler/gnu/4.9。这导致以下错误消息(与上面的类似),这使我认为这不是版本问题:
/pfs/data1/software_uc1/bwhpc/common/compiler/gnu/4.9.2/bin/../include/c++/4.9.2/bits/c++0x_warning.h(32):灾难性错误: #error 指令:此文件需要对 ISO C++ 2011 标准的编译器和库支持。此支持目前是实验性的,必须使用 -std=c++11 或 -std=gnu++11 编译器选项启用。 #error 此文件需要编译器和库支持 \ ^
Metropolis_Sampler_Beta_Edgewise_Cpp_Statistics.cpp 的编译中止(代码 4) 制作:*** [Metropolis_Sampler_Beta_Edgewise_Cpp_Statistics.o] 错误 4 错误:包“test”编译失败
编辑 3:其中一个 cmets 建议 R 包和 R 本身都需要使用相同的编译器版本进行编译。它是否正确? R 是在这台机器上使用 g++ 4.4.7 构建的。这是否意味着唯一可行的解决方案是说服系统管理员使用其他 4.9.2 编译器重新编译 R 并将其作为新模块提供?鉴于“Writing R Extensions”手册中的以下句子,我觉得这很难相信:
在这些平台上,有必要通过个人或网站 Makevars 文件为 C++11 选择不同的编译器。
【问题讨论】:
-
询问集群的系统管理员(也许安装 GCC 4.9)或者,尝试在你的 Linux 笔记本电脑上编译你的东西(也许静态链接它。
-
使用 g++ 4.4.* 你会很难过。那个编译器很老了。
-
我向当地的技术支持人员发送了三封电子邮件,但他从未回复。将试图在他的办公室追踪他。也可以在终端上运行
module load compiler/gnu/4.9,这会导致 g++ 4.9.2,但我收到相同的错误消息。 @Dirl Edelbuettel:您的评论是否也适用于 g++ 4.9.2? -
g++ 4.9.* 可以正常工作;正如我在另一个问题中告诉你的那样,阅读“编写 R 扩展”。您在该集群上的问题可能是您可能希望 R 和 使用相同的编译器编译代码以成功进行动态链接。 Viel Glueck。
-
您不需要让管理员重新编译 R - 事实上,除非您为此进行宣传,否则他们不太可能满足您的要求。如果您可以访问服务器上的构建工具,您可以自己完成。只需获取源 tar 球并按照说明进行操作即可。此外,我可能会大错特错,但从错误消息来看,它似乎想要的只是一些明确启用功能的标志