【问题标题】:Error in including boost tokenizer.hpp file when building R package on MacOS/CRAN在 MacOS/CRAN 上构建 R 包时包含 boost tokenizer.hpp 文件时出错
【发布时间】:2021-10-04 14:37:09
【问题描述】:

我在将我的 R 包发布到 CRAN 时遇到了问题,因为在包含 boost 库时出现了特定错误。包中我的一个 .cpp 文件的顶部是

#include <Rcpp.h>
#include <boost/tokenizer.hpp>
#include <boost/algorithm/string.hpp>
#include <algorithm>
#include <string>
#include <unordered_map>
#include <omp.h>
#include <vector>

// [[Rcpp::depends(BH)]]
// [[Rcpp::plugins(openmp)]]

在 MacOS 上运行检查时(通过rhub::check(platform = "macos-highsierra-release-cran"),我收到以下错误:

在 wgt_jaccard.cpp:6 包含的文件中: /Users/user2suimGYX/R/BH/include/boost/tokenizer.hpp:63:9:错误:'std::_1::wrap_iter' 类型的字段有私有构造函数 : 第一个(c.begin()), 最后一个(c.end()), f(f) { } ^

wgt_jaccard.cpp:117:19: 注意:在函数模板特化的实例化中 'boost::tokenizer<:char_separator std::__1::char_traits>, std::__1::__wrap_iter, std::__1::basic_string ::tokenizer<:internal::string_proxy preservestorage> >' 在这里请求 标记器标记(y(i),sep); ^

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iterator:1420:31:注意:此处声明为私有 _LIBCPP_INLINE_VISIBILITY __wrap_iter(iterator_type __x) _NOEXCEPT_DEBUG : __i(__x) {} ^

我的 Makevars 文件的内容是

PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) -DBOOST_NO_AUTO_PTR
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS)
CXX_STD = CXX11

我已尝试四处搜索,但找不到关于此错误的太多信息。完整包位于here。非常感谢任何帮助。

【问题讨论】:

  • 我会尝试做一个更小的问题。创建一个只做标记器的一次性包,然后通过 RHub 在 macOS 上构建它。也许是头文件顺序,也许是什么——但 something 与我在 Linux 上用g++ 愉快地构建它的地方不同。
  • 我又看了一遍——它与tokenizer 的模板化实例化有关,它与clang++ 摩擦的方式与g++ 不同。通常的补救措施是首先将Rcpp::StringVector 的元素放到普通的std::string 上,让Boost 咀嚼它。一会儿我给你发个 PR。
  • 非常感谢!这解决了它。请随时提交完整答案,我可以将其标记为正确。
  • 感谢您的回答。也可以随意投票(就像我对你的问题所做的那样)(除非你(目前)13 的总业力阻止你这样做,我一直忘记这里的“他们的规则”是什么)。

标签: r boost rcpp r-package


【解决方案1】:

相对于您提供的the repo,我们发现需要进行两处更改:

首先,不要(无条件地)拥有#include &lt;omp.h&gt;,因为 OpenMP 可以是可选的,尤其是。在 macOS 上。一个简单的 #ifdef OPENMP 就可以完成这项工作。

其次,(可以说几乎难以理解)编译器消息与以下事实有关:tokenizer 的 Boost 类型/类被您通过直接从一个Rcpp::CharacterVector。去过那里,这样做了——更保守的方法是首先分配给std::string,然后然后传递它。

有了这两个变化,一切都很好,它也可以在clang++ 下编译在 macOS 上。

(现在已合并,谢谢)PR #2 有血腥的细节,但很短。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 2011-04-20
    • 2016-01-24
    • 2011-12-29
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多