Rcpp:从另一个c ++函数

时间:2017-12-19 12:06:24

标签: c++ rcpp

我正在用C ++编写我的函数以在R中使用它们。因为我不想在同一个文件中包含所有函数,所以我想调用它们。我将举例说明我正在使用的三个文件:

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;
}

的main.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")进行编译时,我收到了此错误:

  

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”):     无法加载共享对象'/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):找不到符号:__ Z12quadraticsumN4arma3ColIdEE     参考自:/private/var/folders/46/1tz_54_n3glfmgftvqsspwrr0000gn/T/Rtmpdnk9hf/sourceCpp-x86_64-apple-darwin13.4.0-0.12.12/sourcecpp_237a88636e6/sourceCpp_2.so     预计在:平面命名空间    在/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。谢谢大家。

2 个答案:

答案 0 :(得分:3)

sourceCpp仅允许单个源文件。

如果要使用多个源文件,则需要构建完整的包。

出现错误是因为第二个源文件尚未编译或链接到共享库中。因此,不存在任何功能实现。

您还可以创建实现staticinline,然后将它们放在标题中,您要避免使用完整的包。如果

答案 1 :(得分:0)

我发现编写#include "function.h"而不是#include <function.h>正确编译。我刚改变了谢谢大家。