2016-04-30 36 views
1

我已經用Rcpp製作了一個R包,以使用我在C++中編程的庫的方法。dyn.load將包與Rcpp鏈接在一起的錯誤

我有R於最後一個版本上運行:

R version 3.2.5 (2016-04-14) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Ubuntu 16.04 LTS 

我執行下面的命令來安裝我的包:

> install.packages("mypackage", repos = NULL) 

包編譯好了,我有的.o我的源代碼文件,但在鏈接階段,我得到了錯誤:

* installing *source* package ‘rbdd’ ... 
** libs 
make: No se hace nada para 'all'. 
installing to /home/sergio/R/x86_64-pc-linux-gnu-library/3.2/mypackage/libs 
** R 
** preparing package for lazy loading 
** help 
Warning: /home/sergio/R/mypackage/man/mypackage-package.Rd:27: All text must be in a section 
Warning: /home/sergio/R/mypackage/man/mypackage-package.Rd:28: All text must be in a section 
*** installing help indices 
** building package indices 
** testing if installed package can be loaded 
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
unable to load shared object '/home/sergio/R/x86_64-pc-linux-gnu-library/3.2/mypackage/libs/mypackage.so': 
/home/sergio/R/x86_64-pc-linux-gnu-library/3.2/mypackage/libs/mypackage.so: undefined symbol: _ZN4cudd12defaultErrorENSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE 
Error: loading failed 
Ejecución interrumpida 
ERROR: loading failed 

mypackge.so is cre在我的包裹的src文件夾中。

我有一個Makevars文件(src,太)具有以下內容:

PKG_CPPFLAGS=-I./buddy-2.5/src -I./cudd-3.0.0/cudd -I./cudd-3.0.0/mtr -I./cudd-3.0.0/cplusplus -I./cudd-3.0.0/dddmp -I./cudd-3.0.0/util -I./cudd-3.0.0 -isystem /usr/include/c++/v1 -std=c++11 
PKG_LIBS=-lc++ -L/lib 

和我的空間文件有行:

useDynLib(mypackage) 
exportPattern("^[[:alpha:]]+") 
importFrom(Rcpp, evalCpp) 

有人知道如何解決這個問題問題?

+0

確保你在'DESCRIPTION'中有'LinkingTo:Rcpp',並且你在'NAMESPACE'中導入了至少一個來自Rcpp的對象,以確保Rcpp被加載。 – Jeroen

+0

@Jeroen是的,我有'LinkingTo:Rcpp'行,我加載Rcpp,我添加了我的'NAMESPACE'文件的內容。 –

回答

1

問題是我正在使用外部庫,我必須編譯它並在編譯我的R庫之前執行ldconfig

2

我有點擔心

PKG_LIBS=-lc++ -L/lib 

你真正的意思/lib?如果是你的圖書館,更常見的地方是/usr/local/lib,這也是默認搜索。

但是,這是一個很大的但你也需要了解你需要做什麼ldconfig適當的設置libfoo.so,libfoo.so.$MAJOR等等。我從Linux HOWTO中學習了許多天。

如果設置正確,您可以通過Rcpp將其鏈接到R。否則,可能會使用系統庫或包本地靜態庫。這種方法也將使您的軟件包更具可移植性。

+0

謝謝!我相信這是我的問題,我在Ubuntu上完全是新手,我正在學習這些錯誤。 尋找關於如何設置我的庫的信息我讀了一些關於創建符號鏈接的信息,但我不知道這個操作的目標目錄,或者如果我需要修改配置文件......之後,我將擁有我的.so文件與主要號碼? 你能給我一個線索來解決它嗎?我有點失落,你看起來像是這些問題的專家。 –

+2

這比我在這裏可以解釋的更多。查找有關創建動態庫的教程。 –