在 MacOS/CRAN 上构建 R 包时包含 boost tokenizer.hpp 文件时出错
Error in including boost tokenizer.hpp file when building R package on MacOS/CRAN
我 运行 遇到将我的 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")
,出现以下错误:
In file included from wgt_jaccard.cpp:6:
/Users/user2suimGYX/R/BH/include/boost/tokenizer.hpp:63:9: error: field of type 'std::_1::wrap_iter<const char *>' has private constructor
: first(c.begin()), last(c.end()), f(f) { }
^
wgt_jaccard.cpp:117:19: note: in instantiation of function template specialization 'boost::tokenizer<boost::char_separator<char, std::__1::char_traits >, std::__1::__wrap_iter<const char *>, std::__1::basic_string ::tokenizer<Rcpp::internal::string_proxy<16, PreserveStorage> >' requested here
tokenizer tokens(y(i), sep);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iterator:1420:31: note: declared private here
_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。非常感谢任何帮助。
相对于您提供的 the repo,我们发现需要进行两项更改:
首先,不要(无条件地)拥有 #include <omp.h>
,因为 OpenMP 可以是可选的,尤其是。在 macOS 上。一个简单的 #ifdef OPENMP
就可以完成这项工作。
其次,(可以说是近乎不可理解的)编译器消息与 tokenizer
的 Boost 类型 / class 被 Rcpp 对象,你通过直接从 Rcpp::CharacterVector
索引给它的。去过那里,完成了 - 更保守的方法是 first 分配给 std::string
然后 然后 传递它。
有了这两个变化,一切都很好,它也可以在 clang++
下的 macOS 上编译。
(现在合并,谢谢)PR #2 有血淋淋的细节,但很短。
我 运行 遇到将我的 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")
,出现以下错误:
In file included from wgt_jaccard.cpp:6: /Users/user2suimGYX/R/BH/include/boost/tokenizer.hpp:63:9: error: field of type 'std::_1::wrap_iter<const char *>' has private constructor : first(c.begin()), last(c.end()), f(f) { } ^
wgt_jaccard.cpp:117:19: note: in instantiation of function template specialization 'boost::tokenizer<boost::char_separator<char, std::__1::char_traits >, std::__1::__wrap_iter<const char *>, std::__1::basic_string ::tokenizer<Rcpp::internal::string_proxy<16, PreserveStorage> >' requested here tokenizer tokens(y(i), sep); ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/iterator:1420:31: note: declared private here _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。非常感谢任何帮助。
相对于您提供的 the repo,我们发现需要进行两项更改:
首先,不要(无条件地)拥有 #include <omp.h>
,因为 OpenMP 可以是可选的,尤其是。在 macOS 上。一个简单的 #ifdef OPENMP
就可以完成这项工作。
其次,(可以说是近乎不可理解的)编译器消息与 tokenizer
的 Boost 类型 / class 被 Rcpp 对象,你通过直接从 Rcpp::CharacterVector
索引给它的。去过那里,完成了 - 更保守的方法是 first 分配给 std::string
然后 然后 传递它。
有了这两个变化,一切都很好,它也可以在 clang++
下的 macOS 上编译。
(现在合并,谢谢)PR #2 有血淋淋的细节,但很短。