2013-10-02 155 views
2

我最近下載了2013 RCPP書斷亞馬遜學習如何更好地使用C++和我的R代碼裏面,我想用第一斐波那契的遞歸函數和包裝的第一個編譯例子,看看我能做到它。我在Ubuntu了最新的R.RCPP一次編譯麻煩

首先我的C++:

/* Cpp based recurive function */ 
int fibonacci(const int x){ 
    if(x == 0) return(0); 
    if(x == 1) return(1); 
    return(fibonacci(x - 1) + fibonacci(x - 2)); 
} 


/* Wrapper */ 
extern "C" SEXP fibWrapper(SEXP xs) { 
    int x = Rcpp::as<int>(xs); 
    int fib = fibonacci(x); 
    return(Rcpp::wrap(fib)); 
} 

然後我開始sh和輸入:

PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` 
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'` 
R CMD SHLIB Fibonacci.cpp 

,但我得到:

g++ -I/usr/share/R/include -DNDEBUG  -fpic -O3 -pipe -g -c Fibonacci.cpp -o Fibonacci.o 
Fibbonacci.cpp:10:12: error: 'SEXP' does not name a type 
make: *** [Fibonacci.o] Error 1 

我想也許我需要包含在我的C++代碼中的指令,所以我再次執行它,但是這次在C++文件的頂部有#include<Rcpp.h>,並再次做同樣的命令,但仍然沒有快樂:

g++ -I/usr/share/R/include -DNDEBUG  -fpic -O3 -pipe -g -c Fibonacci.cpp -o Fibonacci.o 
Fibonacci.cpp:1:18: fatal error: Rcpp.h: No such file or directory 
compilation terminated. 
make: *** [Fibbonacci.o] Error 1 

我做了什麼錯了? 如果我查詢我在SH設定值:

$PKG_CXXFLAGS 
sh: 9: -I/local/yrq12edu/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include: not found 
$PKG_LIBS 
sh: 10: -L/local/yrq12edu/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/lib: not found 

但是我覺得沒有找到的消息都只是因爲-L標誌,因爲這些文件存在,如果我到該目錄。

感謝, 奔。

+0

我對此並不熟悉,大概是這樣的:'Rcpp ::: SHLIB(「fibbonacci.cpp」)'在包含cpp文件的目錄中? – Ward9250

+0

剛剛嘗試過使用Rcpp ::: SHLIB,因爲您和本博客的建議是這樣的:http://www.computerbastard.com/rcpp-c-compilation-trick/我收到以下內容:'$ Rscript -e「 Rcpp ::: SHLIB('fibbonacci.cpp')「 make:***目標'fibbonacci.o'沒有規則,需要'fibbonacci.so'。停止' – Ward9250

+1

對於它的價值,我完全不同意Rcpp :: SHLIB的建議。它可能在這裏被刪除。 –

回答

4

你似乎已經忽略了一個重要的細節。當你這樣做時

PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` 
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'` 
R CMD SHLIB Fibonacci.cpp 

前兩個的結果應該被分配並導出到shell。你在這裏做什麼「分配和忘記」。

從上市2.1遺漏了什麼,顯示這個(或者電子書放棄了它 - 我沒有電子書)是非常重要斜槓,這使得一切一行:

PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` \ 
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'` \ 
R CMD SHLIB Fibonacci.cpp 

現在分配發生在與調用R(一個shell腳本本身)相同的執行中,它具有這些值並將它們傳遞給g ++。

您可以通過接下來的兩行中,我完全引用它擁有所有必需-I和-L片所產生的命令告訴。因此,這兩者(編譯和鏈接步驟)都要經過多行。

所以這本書是正確的,而這一切工作,如果做了showns方式。內聯(在本章後面討論)和屬性(後面在同一章節中討論)基本上都是爲你做PKG_CXXFLAGSPKG_LIBS分配。

編輯:另外,你的測試是錯誤的。你的意思可能是這個

$ PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` 
$ echo $PKG_CXXFLAGS 
-I/usr/local/lib/R/site-library/Rcpp/include 
$ 

你不能只是「調用」 shell變量,因此「沒有發現」你得到的答案。

編輯2:無論如何,您嘗試的例子實際上只是爲了激發第2.4節中的其餘討論,其中詳細描述了多麼費力,容易出錯......這是 - 導致第2.5節和2.6內聯和屬性。兩者都好得多;使用這些。

+0

感謝解釋@DirkEddelbuettel和指向Rcpp屬性的指針Romain。我用反斜槓重新做了這個過程並且它可以工作(你是對的,我忘了提到echo命令)。 – Ward9250

+0

很高興聽到它的作品。屬性在1.2.5和2.6節中有介紹,應該讓你開始。有關全部細節,請參閱Rcpp附帶的小插圖;本書的例子都很好,儘管大多數都是使用內聯。 –

1

您是如何安裝R?它看起來像你缺少R頭。也許你需要安裝r-base-dev package

關於代碼,你不需要包裝。你可以把這個在.cpp文件:

#include <Rcpp.h> 
using namespace Rcpp ; 

// [[Rcpp::export]] 
int fibonacci(const int x){ 
    if(x == 0) return(0); 
    if(x == 1) return(1); 
    return(fibonacci(x - 1) + fibonacci(x - 2)); 
} 

,只是sourceCpp此文件:

> sourceCpp("fib.cpp") 
> fibonacci(6) 
[1] 8 
+0

好的,我會試試這個,我按照我的方式嘗試,因爲我在Rcpp電子書5640的Loc 1318上 - 列表2.2。 – Ward9250

+0

當然。不幸的是,屬性('[[Rcpp :: export]]裝飾)是在Dirk寫作這本書期間(和接近尾聲)出現的,所以它們在本書中沒有多少內容。不過,我們鼓勵人們使用這些日子。例如,Rcpp圖庫中的所有示例都使用屬性。 –

+0

@RomainFrancois:你的第一行有錯誤。編譯器告訴他Rcpp.h缺失,而不是R.h.他有正確的R包;他沒有正確地傳達'-I'標誌。 –