在 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++ 代码不再起作用的主要内容,如果未能解决你的问题,请参考以下文章