2017-12-19 19 views
1

Cで関数を使用してRで使用すると、同じファイル内にすべての関数を含めたくないので、 。Rcpp:別のC++関数からC++関数を呼び出すときにエラーが発生する

function.h

#ifndef FUNCTION_H  
#define FUNCTION_H 

#include <RcppArmadillo.h> 

arma::vec quadraticsum(arma::vec x); 

#endif 

function.cpp

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

using namespace Rcpp; 
using namespace arma; 
using namespace std; 

// [[Rcpp::export]] 

arma::vec quadraticsum(arma::vec x){ 
    arma::vec results = sum(pow(x,2)); 
    return results; 
} 

メインの私はあなたに私が使用している三つのファイルの簡単な例をあげます。 cpp

#include <RcppArmadillo.h> 
#include <function.h> 
// [[Rcpp::depends(RcppArmadillo)]] 
using namespace Rcpp; 
using namespace arma; 
using namespace std; 

// [[Rcpp::export]] 

arma::vec sum2(arma::vec x){ 
    arma::vec results = quadraticsum(x)+2; 
return results; 
} 

私はRstudioと一緒に作業しています。main.cppファイルにコードを書くと、quadraticsumという文字列が認識され、すべてが正常であるようです。私はコマンドsourceCpp("~/main.cpp")を使用してコンパイルする場合しかし、私はこのエラーを得た:

Error in dyn.load("/private/var/folders/46/1tz_54_n3glfmgftvqsspwrr0000gn/T/Rtmpdnk9hf/sourceCpp-x86_64-apple-darwin13.4.0-0.12.12/sourcecpp_237a88636e6/sourceCpp_2.so") : unable to load shared object '/private/var/folders/46/1tz_54_n3glfmgftvqsspwrr0000gn/T/Rtmpdnk9hf/sourceCpp-x86_64-apple-darwin13.4.0-0.12.12/sourcecpp_237a88636e6/sourceCpp_2.so': dlopen(/private/var/folders/46/1tz_54_n3glfmgftvqsspwrr0000gn/T/Rtmpdnk9hf/sourceCpp-x86_64-apple-darwin13.4.0-0.12.12/sourcecpp_237a88636e6/sourceCpp_2.so, 6): Symbol not found: __Z12quadraticsumN4arma3ColIdEE Referenced from: /private/var/folders/46/1tz_54_n3glfmgftvqsspwrr0000gn/T/Rtmpdnk9hf/sourceCpp-x86_64-apple-darwin13.4.0-0.12.12/sourcecpp_237a88636e6/sourceCpp_2.so Expected in: flat namespace in /private/var/folders/46/1tz_54_n3glfmgftvqsspwrr0000gn/T/Rtmpdnk9hf/sourceCpp-x86_64-apple-darwin13.4.0-0.12.12/sourcecpp_237a88636e6/sourceCpp_2.so

は、以前にこの問題を見たことがありますか?私はmacOS 10.12.5を使用しています。皆さん、ありがとうございました。

+0

ファイルが複数ある場合(または複数の機能のみの場合)は、パッケージを作成することを検討してください。 'Rcpp.package.skeleton()'はあなたのためにすべての作業を行います。 –

答えて

3

sourceCppは、単一のソースファイルのみを許可します。

複数のソースファイルを使用する場合は、完全なパッケージをビルドする必要があります。

2番目のソースファイルがコンパイルされていないか、共有ライブラリにリンクされていないため、エラーが表示されます。その結果、関数の実装は存在しません。

staticまたはinlineの実装を作成して、完全なパッケージを避けたいヘッダーに配置することもできます。

+0

もし 'static 'や' inline'を含むコードを修正したいのであれば、どうしたらいいですか? –

0

私は、の代わりに#include "function.h"と書いたことが正しくコンパイルされていることを発見しました。私はちょうどそれを変えた。皆さん、ありがとうございました。

関連する問題