使用boost :: iostreams :: gzip_decompress时,rcpp代码无法加载boost库(在BH中实现)

And*_*lva 5 boost r rcpp

我希望从.bz文件中读取数据.我正在尝试使用BH库使用rcpp plus boost.我在MacOSX 10.10.3,Rcpp版本0.11.6和BH 1.58.0-1上运行R 3.2.0.

这是我到目前为止的代码:

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

#include <Rcpp.h>
#include <iostream>
#include <fstream>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/math/common_factor.hpp>

using namespace Rcpp;

// [[Rcpp::export]]
int read_file_cpp(std::string path) {
  std::ifstream file(path.c_str(), std::ios_base::in | std::ios_base::binary);
  boost::iostreams::filtering_istream in;
  in.push(boost::iostreams::gzip_decompressor());
  in.push(file);
  for(std::string str; std::getline(in, str); )
  {
    std::cout << "Processed line " << str << '\n';
  }
  file.close();
  return(0);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试通过以下方式加载代码时:

Rcpp::sourceCpp(file = "src/boost_test.cpp")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

dyn.load中的错误("/ var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T // RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so"):无法加载共享对象'/ var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T // RtmpZiCsVD/sourcecpp_40e63686ad7f /sourceCpp_9777.so':执行dlopen(/var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so,6):符号未找到:/ VAR /文件夹/ SV/rhmpnyt91kdb10d1hnz_zd1c0000gn/T /:__ZN5boost9iostreams6detail11gzip_footer5resetEv从参考/RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so预期在:/var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so中的平面命名空间

通过一些故障排除,有问题的线似乎是:

in.push(boost::iostreams::gzip_decompressor());
Run Code Online (Sandbox Code Playgroud)

更具体地说,gzip_decompressor()似乎是根本原因.如果我尝试gzip_compressor(),程序工作正常(除了我只是在屏幕上得到二进制乱码).

通过BH代码,我确认gzip_decompressor代码应该是它应该的位置.

感谢您的任何帮助.

UPDATE

根据Dirk和nrussell的建议,这就是我解决问题的方法.

这里下载提升.

阅读说明这里.

解压缩,运行以下内容:

./bootstrap.sh --help
Run Code Online (Sandbox Code Playgroud)

阅读说明,并决定我只需要编译IOstreams.所以,运行以下内容:

./bootstrap.sh --with-libraries=iostreams
./b2
Run Code Online (Sandbox Code Playgroud)

找出编译器查找库的路径.我确信有一种更聪明的方法,但我从R提示符运行以下命令:

Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
Run Code Online (Sandbox Code Playgroud)

从随后的文本中,注意到'/ usr/local/lib'在路径中.因此,在命令提示符下,我在正确的路径中创建了一个指向库的链接:

ln -s /Users/andersgs/Downloads/boost_1_58_0/stage/lib/libboost_iostreams.dylib /usr/local/lib/
Run Code Online (Sandbox Code Playgroud)

这显然需要稍后更正,因为它不会留在我的下载文件夹中.

然后,按照Dirk的指示,按照nrussell的建议.所以,回到R:

Sys.setenv("PKG_LIBS"="-lboost_iostreams")
Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
Run Code Online (Sandbox Code Playgroud)

成功!!!正确编译.也工作.

谢谢你们俩.

安德斯.

Dir*_*tel 3

您确定这“仅适用于标头”吗?

如果没有,您需要确保提供正确的链接参数 - 请参阅Boost regex 上的 Rcpp Gallery 示例,其中有一个有效的示例。