首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rcpp、C++11、向量和窗口的问题

Rcpp、C++11、向量和窗口的问题
EN

Stack Overflow用户
提问于 2014-09-15 16:40:32
回答 1查看 709关注 0票数 0

我尝试在64位Windows上与C++11一起使用Rcpp。我跟随https://stackoverflow.com/a/25456836,使用gcc 4.8.1,R3.1.1和RCPP0.11.2。

使用C++文件simpleProd.cpp

代码语言:javascript
复制
#include <vector>

// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
int simpleProd(std::vector<int> vec) {

  vec.push_back(5);

  int prod = 1;
  for (int &x : vec) {       // loop over all values of vec
    prod *= x;              // access each elem., comp. product
  }  
  return prod;
}

我试过了

代码语言:javascript
复制
library("Rcpp")
Sys.setenv("PKG_CXXFLAGS"="-std=c++11")
unlink("mypkg", recursive = TRUE)
Rcpp.package.skeleton("mypkg", cpp_files = "simpleProd.cpp", 
                      example_code = FALSE)
install.packages("mypkg", repos = NULL, type = "source", 
                 INSTALL_opts = "--no-multiarch")
library(mypkg)

没有问题,但如果我跑了

代码语言:javascript
复制
simpleProd(1:5)

结果是

代码语言:javascript
复制
Error in .Call("mypkg_simpleProd", PACKAGE = "mypkg", vec) : 
  "mypkg_simpleProd" not available for .Call() for package "mypkg"

如果我只是用

代码语言:javascript
复制
  sourceCpp("simpleProd.cpp")
  simpleProd(1:5)

没有问题。如果删除vec.push_back(5);或不使用C++11,则没有问题。在Linux和Mac上没有问题,最后在32位Windows (有相应的工具链)上没有问题。

有什么想法吗?谢谢!

编辑:澄清:问题只发生在特例中:

64位Windows + Rcpp +软件包+ C++11 +矢量操作

如果我改变其中一个,它就能工作。

EN

回答 1

Stack Overflow用户

发布于 2014-09-15 16:45:06

我怀疑你需要逃跑

代码语言:javascript
复制
  compileAttributes("mypkg")          # or setwd() into the directory first

生成属性。

骨架包就是这么做的。如果你在RStudio工作,它也是半自动的.

编辑或更明确地显示,当您使用Rcpp.package.skeleton()函数和提供的文件时,我们可能不会为您运行compileAttributes()。这是个窃听器--我会调查的。但是您可以通过手动运行函数来修复它。

编辑2:对于compileAttributes()的需求,我可能弄错了。您的示例适用于我(使用Rcpp的当前GitHub源代码)。然而,我确实必须启用C++11编译--这是我在~/.R/Makevars中完成的via用户范围的CXXFLAGS。框架代码并不从所提供的文件中插件的使用中推断出这一点的必要性。您还可以手工编辑DESCRIPTIONsrc/Makevars并手动添加。

编辑3:没有问题。在Windows上,您( i)必须降低C++11编译器选项的级别,因为编译器较旧(这不是我们所能控制的),而且我还删除了您的排除多重拱的约束。然后所有的工作,见下文。这是一个运行当前R和当前包的标准Windows 7框。

代码语言:javascript
复制
R> setwd("C:/TEMP")
R> library(Rcpp)
R> Sys.setenv("PKG_CPPFLAGS"="-std=c++0x")
R> Rcpp.package.skeleton("mypkg", cpp_files = "simpleProd.cpp", example_code = FALSE)
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Saving functions and data ...
Making help files ...
Done.
Further steps are described in './mypkg/Read-and-delete-me'.

Adding Rcpp settings
 >> added Imports: Rcpp
 >> added LinkingTo: Rcpp
 >> added useDynLib directive to NAMESPACE
 >> added importFrom(Rcpp, evalCpp) directive to NAMESPACE
 >> copied simpleProd.cpp to src directory
R> install.packages("mypkg", repos = NULL, type = "source")
Installing package into ‘c:/opt/R-library’
(as ‘lib’ is unspecified)
* installing *source* package 'mypkg' ...
** libs

*** arch - i386
g++ -m32 -I"C:/opt/R-CURR~1/include" -DNDEBUG -std=c++0x   -I"c:/opt/R-library/Rcpp/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c RcppExports.cpp -o RcppExports.o
g++ -m32 -I"C:/opt/R-CURR~1/include" -DNDEBUG -std=c++0x   -I"c:/opt/R-library/Rcpp/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c simpleProd.cpp -o simpleProd.o
g++ -m32 -shared -s -static-libgcc -o mypkg.dll tmp.def RcppExports.o simpleProd.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/i386 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/opt/R-CURR~1/bin/i386 -lR
installing to c:/opt/R-library/mypkg/libs/i386

*** arch - x64
g++ -m64 -I"C:/opt/R-CURR~1/include" -DNDEBUG -std=c++0x   -I"c:/opt/R-library/Rcpp/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c RcppExports.cpp -o RcppExports.o
g++ -m64 -I"C:/opt/R-CURR~1/include" -DNDEBUG -std=c++0x   -I"c:/opt/R-library/Rcpp/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c simpleProd.cpp -o simpleProd.o
g++ -m64 -shared -s -static-libgcc -o mypkg.dll tmp.def RcppExports.o simpleProd.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/opt/R-CURR~1/bin/x64 -lR
installing to c:/opt/R-library/mypkg/libs/x64
** R
** preparing package for lazy loading
** help
Warning: C:/TEMP/mypkg/man/mypkg-package.Rd:30: All text must be in a section
Warning: C:/TEMP/mypkg/man/mypkg-package.Rd:31: All text must be in a section
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
*** arch - x64
* DONE (mypkg)
R> library(mypkg)
R> simpleProd(1:5)
[1] 600
R> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25852814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档