【发布时间】: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 的总业力阻止你这样做,我一直忘记这里的“他们的规则”是什么)。