我正在用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。谢谢大家。
答案 0 :(得分:3)
sourceCpp
仅允许单个源文件。
如果要使用多个源文件,则需要构建完整的包。
出现错误是因为第二个源文件尚未编译或链接到共享库中。因此,不存在任何功能实现。
您还可以创建实现static
或inline
,然后将它们放在标题中,您要避免使用完整的包。如果
答案 1 :(得分:0)
我发现编写#include "function.h"
而不是#include <function.h>
正确编译。我刚改变了谢谢大家。