2013-05-20 72 views
1

我想使用RcppArmadillo中包含的一些功能。正如我在SO上的另一篇文章中讀到的,如果包含RcppArmadillo.h,則不應包含Rcpp.h。我只是這樣做的,但是當試圖編譯.cpp文件時,我收到了一些錯誤消息。 編輯。每德克的建議,我只包括RcppArmadillo.h,這顯著減少錯誤信息的數量:最小程度重複性代碼如下:在包含RcppArmadillo.h後,編譯代碼時發生錯誤

#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

using namespace Rcpp; 
using namespace arma; 

template <class RandomAccessIterator, class StrictWeakOrdering> 
void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp); 

struct val_order{ 
     int order; 
     double value; 
}; 

bool compare(const val_order & a, const val_order & b){return (a.value<b.value);} 

// [[Rcpp::export]] 
IntegerVector order(NumericVector x){ 
    int n=x.size(); 
    std::vector<int> output(n); 
    std::vector<val_order> index(n); 
    for(int i=0;i<x.size();i++){ 
     index[i].value=x(i); 
     index[i].order=i; 
    } 
    std::sort(index.begin(), index.end(), compare); 
    for(int i=0;i<x.size();i++){ 
     output[i]=index[i].order; 
    } 
    return wrap(output); 
} 

錯誤消息如下:

Error in sourceCpp("functions.cpp") : 
    Error 1 occurred building shared library. 
ld: warning: directory not found for option '-L/usr/local/lib/gcc/i686-apple-darwin8/4.2.3/x86_64' 
ld: warning: directory not found for option '-L/usr/local/lib/x86_64' 
ld: warning: directory not found for option '-L/usr/local/lib/gcc/i686-apple-darwin8/4.2.3' 
ld: library not found for -lgfortran 
collect2: ld returned 1 exit status 
make: *** [sourceCpp_44748.so] Error 1 

只是重申,這代碼在編譯時沒有問題,當我使用Rcpp.h時。

回答

1

有幾件事情:

  1. 您的文章是沒有幫助的。我們不需要幾十行錯誤消息,但我們確實需要可複製的代碼。你沒有包括在內。

  2. 您包含幾個C++頭文件幾個R頭文件。別。

  3. 只包含一個頭文件:RcppArmadillo.h,如果失敗,則發佈一個可重複的示例。

編輯:感謝您的更新。您的代碼現在編譯,您的錯誤是一個鏈接器錯誤。你只需要在OS X下安裝Fortran編譯器。

+0

嗨德克,謝謝你的回覆。我用一個可重現的例子更新了我的帖子。根據你的建議,我只包含了'RcppArmadillo.h',它消除了90%的錯誤信息。 – Alex

+0

謝謝。這是正確的方向,但我在工作,不能爲您調試您的代碼。簡化/更改你的代碼,你仍然知道哪個單一的陳述會導致錯誤,然後「認真思考」該行。如果您仍然陷入困境,請隨時在此處或rcpp-devel詢問。 –