我正在用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中的平面命名空间0.12 / sourcecpp_237a88636e6 / sourceCpp_2.so
你以前见过这个问题吗?我正在使用macOS 10.12.5。谢谢你们。
sourceCpp
只允许单个源文件。
如果要使用多个源文件,则需要构建完整的包。
出现错误是因为第二个源文件尚未编译或链接到共享库中。因此,不存在任何功能实现。
您还可以将实现static
或inline
,然后将它们放在标题中,您要避免使用完整的包。如果
我发现写#include "function.h"
而不是#include <function.h>
它正确编译。我刚改变了谢谢你们。