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

时间:2014-08-10 00:12:44

标签: c++ r macos gcc osx-mavericks

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

我写了一些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

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:6)

基于以下网站的有用网站: 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 /

这将创建您需要像以前一样继续编译的内容。

答案 1 :(得分:1)

由于它开始工作,我可以发布这种情况的答案。

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

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

  

警告:找不到选项的目录   '-L的/ usr /本地/ LIB / GCC / x86_64的-苹果darwin13.0.0 / 4.8.2'

应用下一个算法:

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