Rcpp、C++11、矢量和Windows的问题
Problems with Rcpp, C++11, vectors and Windows
我尝试在64位Windows上使用Rcpp和C++11。我紧随其后https://stackoverflow.com/a/25456836并使用gcc 4.8.1与R 3.1.1和Rcpp 0.11.2。
使用C++文件simpleProd.cpp
#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;
}
我试过R
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)
没有问题,但如果我运行
simpleProd(1:5)
结果是
Error in .Call("mypkg_simpleProd", PACKAGE = "mypkg", vec) :
"mypkg_simpleProd" not available for .Call() for package "mypkg"
如果我只是使用
sourceCpp("simpleProd.cpp")
simpleProd(1:5)
没有问题。如果移除了vec.push_back(5);
或者没有使用C++11,则没有问题。在Linux和Mac上没有问题,最后在32位Windows(带有相应的工具链)上没有问题。
知道吗?非常感谢。
编辑:澄清:问题只发生在特殊情况下:
64位Windows+Rcpp+Package+C++11+矢量运算。
如果我更改其中一个,它会起作用。
我怀疑您需要运行
compileAttributes("mypkg") # or setwd() into the directory first
以生成属性。
骨架包可以做到这一点。如果你在RStudio工作,它也是半自动的。
编辑或者更明确地说,当您对提供的文件使用Rcpp.package.skeleton()
函数时,我们可能不会为您运行compileAttributes()
。这是一个错误,我会调查的。但是您可以通过手动运行函数来修复它。
编辑2:我可能对compileAttributes()
的需求错了。你的例子适用于我(使用Rcpp的当前GitHub源代码)。然而,我确实必须启用C++11编译——这是我在~/.R/Makevars
中通过用户范围的CXXFLAGS
实现的。骨架代码并没有从提供的文件中使用的插件中推断出需要这样做。您也可以手动编辑DESCRIPTION
或src/Makevars
,然后手动添加。
编辑3:没有问题。在Windows上,您i)必须降级C++11编译器选项,因为编译器较旧(这不是我们可以控制的),并且ii)我还删除了您排除multi-arch的限制。然后一切正常,见下文。这是一个标准的Windows7盒子,运行当前的R和当前的软件包。
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>
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 使用 MinGW 在 Windows 上构建 GLEW 时遇到问题
- 父进程意外被子 cmd 杀死.exe运行 java jar 的进程 - WINDOWS 7 问题 - C++
- 在 Windows 服务中使用命名管道时出现问题
- 在 Windows 10 上安装 Boost 时遇到问题
- CMake Qt建立在Windows链接器问题之上
- C++ Windows.h 的问题,在 vs17 中非法声明匿名'struct'
- 在 Windows 问题上连接到企业 WiFi
- C++、Python 3.7.4、SWIG 4.0.0 和 Windows 10 的问题 - ModuleNotFoun
- Windows 凭据提示问题,CredUnPackAuthenticationBuffer 错误 50
- 使用 Bazel (Windows) 构建 Tensorflow 的问题 => 使用 Tensorflow C++ API
- 显示和隐藏Windows 10屏幕键盘(osk.exe)时遇到问题
- 在 Windows 上使用 Emscripten 和 CMake 编译 GLFM 的问题
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- 在 Visual Studio 的 Windows 上安装 MPIR 时遇到问题
- 将Qt Creator Projet移植到Windows时的z.lib问题
- Windows 8.1和Windows 10上的Sedebugprivilege问题
- Windows到Raspberry Pi Zero串行问题
- MATLAB引擎Windows 7问题
- GCC编译器Windows问题