Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从另一个.cpp文件调用cpp函数时出错 我试图从另一个.cpp文件调用C++函数。 我使用了.h标题。 看看下面我做了什么_C++_Rcpp - Fatal编程技术网

从另一个.cpp文件调用cpp函数时出错 我试图从另一个.cpp文件调用C++函数。 我使用了.h标题。 看看下面我做了什么

从另一个.cpp文件调用cpp函数时出错 我试图从另一个.cpp文件调用C++函数。 我使用了.h标题。 看看下面我做了什么,c++,rcpp,C++,Rcpp,我有一个f.h文件: #ifndef PACKAGENAME_ADD_H #define PACKAGENAME_ADD_H #include <Rcpp.h> Rcpp::NumericVector f(Rcpp::NumericVector x) ; #endif #include <Rcpp.h> using namespace Rcpp; NumericVector f(NumericVector x) { return x * 2; } #incl

我有一个f.h文件:

#ifndef PACKAGENAME_ADD_H
#define PACKAGENAME_ADD_H

#include <Rcpp.h>
Rcpp::NumericVector f(Rcpp::NumericVector x) ;

#endif
#include <Rcpp.h>
using namespace Rcpp;

NumericVector f(NumericVector x) {
  return x * 2;
}
#include <Rcpp.h>
#include <f.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector g(NumericVector x) {
  return f(x);
}
动态加载中出错(“/tmp/Rtmpdu4AWp/sourceCpp-x86_64-pc-linux-gnu-0.12.17/sourceCpp_260f5e1a9ebc/sourceCpp_9.so”): 无法加载共享对象“/tmp/Rtmpdu4AWp/sourceCpp-x86_64-pc-linux-gnu-0.12.17/sourceCpp_260f5e1a9ebc/sourceCpp_9.so”: /tmp/Rtmpdu4AWp/sourceCpp-x86_64-pc-linux-gnu-0.12.17/sourceCpp_260f5e1a9ebc/sourceCpp_9.so:未定义的符号:z1Fn4RCPP6Vectoril14Ens\u15PreserveStoreEE

有人能帮我吗?
我在ubuntu 18.04上工作,我有R3.4.4版本。

我最熟悉的处理这个问题的方法是创建一个包。如果你在原来的帖子中出现,正如作者所指出的,这并不是真的必要;在将
g.cpp
f.h
周围的括号(
)更改为引号(
“”
)后,您的代码使用
sourceCpp()
对我来说编译得很好:

(有关详细信息,请参见本手册第1.10节)

但是,如果您最终需要编译多个
.cpp
文件(即,不只是一个依赖于另一个实现的文件),那么方法就是创建一个包。这听起来可能有点牵强或吓人,但有了
Rcpp
提供的工具,这真的很简单。以下是我将代码转换为包所采取的步骤:

  • 从R运行
    Rcpp::Rcpp.package.skeleton(“SOanswer”,示例\u code=FALSE)
  • 删除文件
    读取并删除我
  • 将原始文件中的C++文件添加到代码> SRC/< /Cord>文件夹中(只需一个小编辑),在代码< >代码> G.CPP < /代码>中,将括号(<代码> <代码> >更改为引号(<代码>)>代码>)。
  • 从R运行
    Rcpp::compileAttributes(“SOanswer/”)
    devtools::install(“SOanswer/”)
  • 然后它应该可以很好地编译,您可以从R运行
    g()

    SOanswer::g(1:10)
    # [1]  2  4  6  8 10 12 14 16 18 20
    

    我要说的是,我将在这里添加一个步骤0:阅读上的小片段,特别是Rcpp简介和Rcpp包小片段。您还可以签出带有注释中提供的
    src/
    中标题的包。

    包含标题只会为您提供函数声明—对于编译器来说足够了,对于链接器来说不够。要实际创建可执行文件,还需要与实现(定义函数的对象文件或库)链接。同一文件夹中的源文件是不相关的。谢谢@JesperJuhl的回复。拜托,我是初学者。你能再解释一下吗?重复的?我不知道understand@Ari.stat我会遵循Dirk(Rcpp的创建者)经常给出的建议,创建一个包
    sourceCpp()
    不适用于多个文件。通过Rcpp调用R C++包是简单的;请看“代码>帮助”(“RCPP:RCP.Pr.FraskForm”)或(或免责声明:MIN),并以C++和FORTRAN为例从头开始打包包的例子。code@JesperJuhl所有这些都是真实的,但是对于在编译中从C++调用C++代码的OP情况的人来说,几乎没有什么帮助。所有这些都需要
    Rcpp
    R软件包的帮助。正如Ralf Stubner提到的,“在Rcpp的上下文中,编译和链接在某种程度上是自动化的。”从R调用
    sourceCpp()
    的人是从一个完全不同于您所熟悉的上下文中得出这个结论的。在某一点上,标记为dupe的问题和您提到的内容可能会有所帮助,但如果您不了解这与R/Rcpp特定问题的混合情况,就不能不了解。要借助@duckmayr的答案,请在
    src/
    中查看带有标题的包实现,太棒了!当我将g.cpp中f.h的括号()改为引号(“”)时,效果非常好。谢谢你的帮助。Ended,我想进一步创建一个包,但我现在需要一些cheikings的函数。我有一些关于包裹的问题。我应该在我的包主文件夹中为.h文件创建一个子文件夹inst/include/还是可以将它们放在scr/folder中?@coatless Good resource!我已将其添加到答案中。@Ari.stat两者都可以,但如果您希望其他R包能够链接到您的头文件,则需要执行
    inst/include
    路径。如果您想看到这样做的R包的例子,请检查我在GITHUB上开发的两个包:(为RCPP用户提供更多的概率分布的C++标题),(我不想寻找其他包来链接到我的头,我只是出于习惯而这样做)@内部函数的Ari.stat头文件应进入
    src
    。在
    inst/include
    中,我只会为其他软件包使用的函数放置头文件。这些必须是仅标题的函数或正确注册到R。Rcpp可以使用
    Rcpp::interfaces
    属性自动注册。例如,请参见我的软件包。
    Rcpp::sourceCpp("g.cpp")
    g(1:10)
    # [1]  2  4  6  8 10 12 14 16 18 20
    
    SOanswer::g(1:10)
    # [1]  2  4  6  8 10 12 14 16 18 20