我有一个名为的头文件coolStuff.h包含一个awesomeSauce(arg1)我想在我的cpp源文件中使用的函数.
目录结构:
代码:
#include <Rcpp.h>
#include <cppHeaders/coolStuff.h>
using namespace Rcpp;
// [[Rcpp::export]]
double someFunctionCpp(double someInput){
double someOutput = awesomeSauce(someInput);
return someOutput;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
theCppFile.cpp:2:31: error: cppHeaders/coolStuff.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我已经移动了整个地方的文件和目录,似乎无法让它工作.我看到使用第三方标题的示例,只是说这样做:
#include <boost/array.hpp>
Run Code Online (Sandbox Code Playgroud)
(来自Hadley/devtools)
https://github.com/hadley/devtools/wiki/Rcpp
什么给出了什么?我整个上午一直在寻找,但找不到像我这样简单事情的答案.
好了,我已经想出如何在Rstudio中构建使用Rcpp的软件包,让我重新解释一下这个问题.我有一个独立的头文件coolStuff.h,它包含我想在我的cpp代码中使用的函数.
1)我应该在包目录结构中放置coolStuff.h,以便它包含的函数可以被CppFile.cpp使用?
2)如何在cpp文件中调用coolStuff.h?再次感谢你的帮助.我从上次谈话中学到了很多东西.
注意:我阅读了小插图"编写使用Rcpp的软件包",但没有解释如何执行此操作.
好吧,让我总结一下我的问题的答案,因为它分散在这个页面上.如果我得到一个错误的细节,请随时编辑或让我知道,我将编辑它:
因此,您找到了一个.h或多个.cpp文件,其中包含您要在.cpp要编写的文件中使用的函数或其他一些代码Rcpp.
让我们继续调用这个找到的代码coolStuff.h并调用你想要使用的函数awesomeSauce().让我们调用您正在编写的文件theCppFile.cpp.
(我应该注意这里.h文件和.cpp文件中的代码都是C++代码,它们之间的区别在于C++程序员以正确的方式保持组织.我将在这里讨论差异,但在SO上进行简单的搜索会引导你讨论差异.对于你需要使用你发现的代码的R程序员,没有真正的区别.)
简而言之:您可以使用一个文件,coolStuff.h如果它不调用其他库,通过剪切和粘贴theCppFile.cpp,或者如果您创建一个包,您可以将文件放在\src包含该theCppFile.cpp文件的目录中并在文件#include "coolStuff.h"顶部使用你在写作 后者更灵活,允许您coolStuff.h在其他.cpp文件中使用函数.
细节:
1)coolStuff.h不得调用其他库.这意味着它不能在顶部包含任何include语句.如果是这样,我在下面详述的内容可能不起作用,并且使用调用其他库的已找到代码超出了本答案的范围.
2)如果你要编译的文件,sourceCpp()你需要剪切并粘贴coolStuff.h到theCppFile.cpp.我被告知有异常,但是sourceCpp()设计用于编译一个.cpp文件,因此这是最好的路径.
(注意:我不保证简单的剪切和粘贴将开箱即用.您可能必须重命名变量,或者更有可能切换所使用的数据类型以与您使用的数据类型保持一致theCppFile.cpp.但到目前为止,使用6种不同的简单.h文件,剪切和粘贴对我来说很简单
3)如果您只需要使用coolStuff.hin theCppFile.cpp和其他地方的代码,那么您应该将其剪切并粘贴到其中theCppFile.cpp.
(我再也不保证看到上面关于剪切和粘贴的说明)
4)如果你想使用包含在代码coolStuff.h中theCppFile.cpp和其他.cpp文件,你需要考虑建立一个包.这并不难,但可能有点棘手,因为有关使用Rcpp构建软件包的信息范围从您想要的任何R软件包的详尽彻底的文档(但是作为新手高于你的头脑),以及新手敏感介绍(可能会遗漏您碰巧需要的细节).
这是我的建议:
A)首先获得一个theCppFile.cpp带有coolStuff.h剪切和粘贴代码的版本,然后按照您的预期进行theCppFile.cpp编译sourceCpp().这不是必须的,但是如果您是Rcpp OR软件包的新手,那么在转移到下面更复杂的情况之前,确保您的代码在这种简单的情况下工作是很好的.
B)现在使用Rcpp.package.skeleton()或使用RStudio中的Build功能构建您的包(强烈推荐).您可以Rcpp.package.skeleton()在hadley/devtools或Rcpp Attributes Vignette中找到有关使用的详细信息.使用Rcpp编写软件包的完整文档位于使用Rcpp的编写软件包中,但是这个文件假定您已经很好地了解了C++,并且没有使用新的"属性"方式来执行Rcpp.
如果使用RStudio或compileAttributes()不在RStudio中,请不要忘记"构建和重新加载" .
C)现在您应该在\ R目录中看到一个名为的文件RcppExports.R.打开它并检查出来.在RcppExports.R您应该看到\src目录中所有.cpp文件的R包装函数.很甜蜜.
D)尝试与您编写的函数对应的R函数theCppFile.cpp.它有用吗?如果是这样的话.
E)随着您的包构建,您可以移动coolStuff.h到src文件夹中theCppFile.cpp.
F)现在你可以从删除剪切和粘贴代码theCppFile.cpp,并在顶部theCppFile.cpp(你想使用coolStuff.h代码的任何其他.cpp文件)把#include "coolStuff.h"刚过#include <Rcpp.h>.请注意,ranker.h周围没有括号,而是有"".当包含用户提供的本地文件而不是像Rcpp或STL等库文件时,这是一个C++约定...
G)现在你必须重建包.在RStudio中,这只是Build菜单中的"Build&Reload".如果你不使用RStudio,你应该运行compileAttributes()
H)现在再次尝试R功能,就像在步骤D)中那样,希望它可以工作.
jja*_*ire 21
问题是sourceCpp明确地设计为仅构建单个独立源文件.如果你想sourceCpp拥有依赖关系,那么他们需要:
在系统中包含目录(即/usr/local/lib或/usr/lib); 要么
在您在Rcpp::depends属性中列出的R包中
正如Dirk所说,如果你想构建多个源文件,那么你应该考虑使用R包而不是sourceCpp.
请注意,如果您正在处理程序包并在程序包的src目录中的文件上执行sourceCpp,它将构建它,就像它在程序包中一样(即,您可以包含src目录或inst/include目录中的文件).
小智 7
通过在调用sourceCpp之前设置两个环境变量,我能够链接任何库(在这种情况下为MPFR):
Sys.setenv("PKG_CXXFLAGS"="-I/usr/include")
Sys.setenv("PKG_LIBS"="-L/usr/lib/x86_64-linux-gnu/ -lm -lmpc -lgmp -lmpfr")
Run Code Online (Sandbox Code Playgroud)
第一个变量包含库头的路径.第二个包括库二进制文件的路径及其文件名.在这种情况下,还需要其他依赖库.有关更多详细信息,请检查g ++编译和链接标志.通常可以使用pkg-config获取此信息:
pkg-config --cflags --libs mylib
Run Code Online (Sandbox Code Playgroud)
为了更好地理解,我建议使用带有详细输出的sourceCpp来打印g ++编译和链接命令:
sourceCpp("mysource.cpp", verbose=TRUE, rebuild=TRUE)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9279 次 |
| 最近记录: |