【问题标题】:Creating .dll files and compiling C++ code using Rcpp on Windows在 Windows 上使用 Rcpp 创建 .dll 文件并编译 C++ 代码
【发布时间】:2015-01-08 15:39:00
【问题描述】:

我很难让 Rcpp 在我的 Windows 上运行。我下载了 Rtools 并且我已将路径更改为

c:\Rtools\bin;c:\Rtools\gcc-4.6.3\bin;c:\Program Files\R\R-3.0.2\bin\x64;[其他]

然后我获取了一个非常简单的 c++ 文件 (new.cpp),如下所示

include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int timesTwo(int x) {
return x * 2;
}

然后我继续使用 Powershell,并按照无缝 R 和 C++ 的建议 D. Eddelbuettel 与 Rcpp 集成(第 2 章)我尝试编译代码

PS C:\Users\RXD308\pgmcpp> PKG_CXXFLAGS='Rscript -e 'Rcpp:::CxxFlags()''\ PKG_LIBS='Rscript -e 'Rcpp:::LdFlags()''\ RCMD SHLIB new.cpp

获取错误

An expression was expected after '('.
At line:1 char:43
+ PKG_CXXFLAGS='Rscript -e 'Rcpp:::CxxFlags( <<<< )''\ PKG_LIBS='Rscript -e 'Rcpp:::LdFlags()''\ RCMD SHLIB new.cpp
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression

最后两件事

  • 我已启动 MinGW 并在我的计算机上工作 (g++ 4.6)

  • 我认为我在 powershell 中的 R 命令存在重大问题。事实上,当我访问 powershell 并输入“R --version”时,我得到了这个错误

    Invoke-History : Cannot locate history for commandline --version.
    At line:1 char:2
    + R <<<<  --version
    + CategoryInfo          : ObjectNotFound: (--version:String) [Invoke-History],     ArgumentException
    + FullyQualifiedErrorId : InvokeHistoryNoHistoryForCommandline,Microsoft.PowerShell.Commands.InvokeHistoryCommand
    

【问题讨论】:

    标签: c++ r windows powershell rcpp


    【解决方案1】:

    这是一个shell错误:

    PKG_CXXFLAGS='Rscript -e 'Rcpp:::CxxFlags()''
    PKG_LIBS='Rscript -e 'Rcpp:::LdFlags()''
    RCMD SHLIB new.cpp
    

    因为您在单个刻度内有单个刻度。仔细看第 24 页,看看后向记号和前向记号之间的区别。向后意味着执行。

    在解决这个问题时,您可以通过在 R 会话中执行类似 Rcpp::LdFlags() 之类的内容来避免这些二级间接,然后将生成的字符串复制到 Makevars 中。

    这将帮助您编译代码,这是首要任务。

    为了创建可分发的 Makevar,您可以更仔细地查看已发布的解决方案。

    编辑: 确保你可以在跑步之前步行。从这样的事情开始

    C:\>R CMD config CXXFLAGS
    -O2 -Wall -mtune=core2
    
    C:\>
    

    然后朝着Rscript 调用Rcpp 函数,如图所示。也许你有 powershell 问题;我刚刚在cmd.exe 中做到了这一点。

    【讨论】:

    • 更正了刻度,但仍然出现错误 'PKG_CXXFLAGS=Rscript' 一词未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。在 line:1 char:22 + PKG_CXXFLAGS=Rscript &lt;&lt;&lt;&lt; -e 'Rcpp:::CxxFlags()'\ PKG_LIBS=Rscript -e 'Rcpp:::LdFlags()'\ RCMD SHLIB new.cpp + CategoryInfo : ObjectNotFound: (PKG_CXXFLAGS=Rscript:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
    • 看来很多问题都是由powershell引起的。事实上,我设法运行了 R CMD config CXXFLAGS -O2 -Wall -mtune=core2 但再次编写 PKG_CXXFLAGS='Rscript -e 'Rcpp:::CxxFlags()''\ PKG_LIBS='Rscript -e 等行似乎 PKG_CXXFLAGS 不被识别为命令。我使用的命令是否适合 Windows 语法?
    • 大写的东西不是命令,而是传递给 make 的环境变量。这都是非常标准的,并且在很多地方都有解释。
    • 能否给我一个链接,我可以在其中找到有关如何在 Windows 上使用 PKG_CXXFLAGS 和 PKG_LIBS 命令的明确说明?我试图将它们用作“制作”的论据,但它也失败了。我不太习惯运行命令行指令。
    • 我继续阅读“R 扩展”手册,它建议将标志添加到 makevars 文件中。我进行了搜索,我拥有的唯一 makevars 文件位于 RcppEigen/skeleton 中。然后我尝试将以下行添加到文件中 -I PKG_CXXFLAGS=Rscript -e 'Rcpp:::CxxFlags()'` -L PKG_LIBS=Rscript -e 'Rcpp:::LdFlags()'`` 但是运行时并没有真正改变命令 R CMD SHLIB。我仍然得到“错误:包含没有命名类型”
    猜你喜欢
    • 2023-03-22
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多