我有一个名为的头文件coolStuff.h
,其中包含awesomeSauce(arg1)
我想在我的 cpp 源文件中使用的函数。
目录结构:
- 工作目录
- 源Cpp
- Cpp文件.cpp
- cppHeaders
- 酷东西
- 源Cpp
编码:
#include <Rcpp.h>
#include <cppHeaders/coolStuff.h>
using namespace Rcpp;
// [[Rcpp::export]]
double someFunctionCpp(double someInput){
double someOutput = awesomeSauce(someInput);
return someOutput;
}
我得到错误:
theCppFile.cpp:2:31: error: cppHeaders/coolStuff.h: No such file or directory
我已将文件和目录移动到各处,但似乎无法使其正常工作。我到处都看到了使用 3rd 方标头的示例,这些示例说只是这样做:
#include <boost/array.hpp>
(来自 Hadley/devtools)
https://github.com/hadley/devtools/wiki/Rcpp
那么给了什么?我整个早上都在搜索,但找不到对我来说似乎很简单的事情的答案。
更新 01.11.12
好的,现在我已经弄清楚了如何在 Rstudio 中构建使用 Rcpp 的包,让我重新表述一下这个问题。我有一个独立的头文件coolStuff.h,其中包含我想在我的cpp 代码中使用的函数。
1) 我应该将coolStuff.h 放在包目录结构的什么位置,以便CppFile.cpp 可以使用它包含的功能?
2) 如何在 cpp 文件中调用coolStuff.h?再次感谢你的帮助。我从上次的谈话中学到了很多。
注意:我阅读了小插图“编写使用 Rcpp 的包”,它没有解释如何执行此操作。
答案:
好的,让我总结一下我的问题的答案,因为它分散在这个页面上。如果我有错误的细节,请随时编辑或让我知道,我会编辑它:
因此,您找到了一个.h
or文件,其中包含要在您正在编写.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
不得调用其他库。所以这意味着它不能在顶部有任何包含语句。如果是这样,我在下面详述的内容可能不起作用,并且使用调用其他库的找到的代码超出了此答案的范围。
2)如果要编译文件,sourceCpp()
需要剪切并粘贴coolStuff.h
到theCppFile.cpp
. 我被告知有例外,但sourceCpp()
旨在编译一个.cpp
文件,所以这是最好的途径。
(注意:我不保证简单的剪切和粘贴可以开箱即用。您可能必须重命名变量,或者更有可能将正在使用的数据类型切换为与您在 中使用的一致theCppFile.cpp
。但到目前为止,使用 6 个不同的简单.h
文件,剪切和粘贴对我来说非常简单)
3) 如果您只需要使用coolStuff.h
intheCppFile.cpp
而没有其他地方的代码,那么您应该将其剪切并粘贴到theCppFile.cpp
.
(我再次不保证请参阅上面关于剪切和粘贴的说明)
4) 如果你想使用AND 其他文件中包含coolStuff.h
的代码,你需要考虑构建一个包。这并不难,但可能有点棘手,因为那里有关使用 Rcpp 构建包的信息范围从您想要的任何 R 包的详尽彻底的文档(但对于新手来说,这超出了您的头顶),以及新手敏感介绍(可能会遗漏您碰巧需要的细节)。theCppFile.cpp
.cpp
这是我的建议:
A)首先从剪切和粘贴theCppFile.cpp
代码中获得一个版本,该版本可以编译并按您期望的方式工作。这不是必须的,但如果您是 Rcpp OR 包的新手,最好确保您的代码在这种简单情况下工作,然后再转到下面更复杂的情况。coolStuff.h
theCppFile.cpp
sourceCpp()
B) 现在使用Rcpp.package.skeleton()
或使用 RStudio 中的构建功能构建您的包(强烈推荐)。Rcpp.package.skeleton()
您可以在hadley/devtools或Rcpp Attributes Vignette中找到有关使用的详细信息。使用 Rcpp 编写包的完整文档在编写使用 Rcpp 的包中,但是本文假设您对 C++ 的使用方式相当了解,并且不使用新的“属性”方式来执行 Rcpp。
compileAttributes()
如果使用 RStudio 或者您不在 RStudio 中,请不要忘记“构建和重新加载” 。
C) 现在您应该在 \R 目录中看到一个名为RcppExports.R
. 打开它并检查一下。RcppExports.R
您应该会看到目录中所有 .cpp 文件的 R 包装函数\src
。挺甜的。
D) 尝试与您在 中编写的函数相对应的 R 函数theCppFile.cpp
。它有效吗?如果是这样继续。
coolStuff.h
E)构建好包后,您可以src
使用theCppFile.cpp
.
F) 现在您可以从theCppFile.cpp
. 请注意,ranker.h 周围没有括号,而是有“”。当包含用户提供的本地文件而不是 Rcpp 或 STL 等库文件时,这是 C++ 约定...theCppFile.cpp
#include "coolStuff.h"
#include <Rcpp.h>
G) 现在你必须重建包。在 RStudio 中,这只是 Build 菜单中的“Build & Reload”。如果您不使用 RStudio,您应该运行compileAttributes()
H) 现在再次尝试 R 函数,就像在步骤 D) 中所做的那样,希望它可以工作。