在 R 中编译 c++ 代码不再起作用

Posted

技术标签:

【中文标题】在 R 中编译 c++ 代码不再起作用【英文标题】:Compile c++ code in R does not work anymore 【发布时间】:2014-08-10 00:12:43 【问题描述】:

我开始说我是编程新手,然后我不确定我能否很好地解释我的问题。

我编写了一些 C++ 代码,这些代码被一些 R 函数加载和使用。

为了编译代码,我使用了以下代码:

R  CMD SHLIB   MyCode.cpp

我用 R 加载了库

dyn.load("MyCOde.so")  

有时我还构建了一个 R 包,我能够将它加载到 R 中。

如果我在 Mac 上用山狮做所有这些事情,一切都很好,但现在我切换到小牛,我遇到了一些问题。 R CMD SHLIB MyCode.cpp 命令有效,但是当我使用 dyn.load("MyCOde.so") 时,我得到以下文本:

Errore in dyn.load(paste(dir_function, "MyCOde.so", sep = "")) : 
  unable to load shared object 'MyCOde.so':
  dlopen(MyCOde.so, 6): Symbol not found: __ZNSt8ios_base4InitC1Ev
  Referenced from: MyCOde.so
  Expected in: flat namespace
 in MyCOde.so

此外,如果我尝试在 R 中加载包,我会得到以下信息

ld: warning: directory not found for option '-L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2'
ld: library not found for -lquadmath
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [MyCode.so] Error 1

有人可以帮助我吗?

【问题讨论】:

看起来您从 GCC 切换到 CLang,但您的 MyCOde.so 指向 GCC 实现。用 CLang 重建它。 你知道你用的是哪个编译器吗? 当我输入 R CMD SHLIB MyCode.cpp 我得到 clang++ -dynamiclib -Wl,-headerpad_max_install_names.......,所以我猜是 clang 但是您的库指向 GCC 4.8.2:ld:警告:找不到选项 '-L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8 的目录。 2' 用 CLang 重建你的库。这应该可以解决问题。 【参考方案1】:

基于以下有用的网站: thecoatlessprofessor

在终端 shell 中输入:

curl -O http://r.research.att.com/libs/gfortran-4.8.2-darwin13.tar.bz2
sudo tar fvxz gfortran-4.8.2-darwin13.tar.bz2 -C /

这将创建您恢复编译所需的内容。

【讨论】:

【参考方案2】:

既然它开始工作,我就可以发布这种情况的答案。

当您更改编译器和标准库时 - 请注意不同的库有不同的实现和不同的标准支持。更改系统的基础可能需要使用新的 C++ 标准库完全重建系统。

您的图书馆也不例外。因此,如果您的链接器中有这样的错误:

警告:找不到选项的目录 '-L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2'

应用下一个算法:

    检查目录/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2是否还存在。我敢打赌不是。 检查您是否还有来自错过的编译器的 libstdc++?通常,如果您升级相同的编译器并且 C++ 标准库 ABI 没有改变,一切都应该继续工作。如果 ABI 发生变化或您切换标准 C++ 库和编译器 - 您将面临大规模的系统重建。 使用新的 C++ 标准库和编译器重新编译您的库和应用程序。

【讨论】:

以上是关于在 R 中编译 c++ 代码不再起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥预编译资产不再起作用?

AIX和Linux C++编译器差别总结

extern “C”的作用详解

有没有办法在 C++ 编译时限制数据大小并产生编译错误?

安装包后Webpack无法编译错误

C++中#if #ifdef 的作用