我希望从.bz文件读取数据。我正在尝试使用rcpp和使用BH库的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);
}


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

Rcpp::sourceCpp(file = "src/boost_test.cpp")


我收到以下错误:


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):找不到符号:__ ZN5boost9iostreams6detail11gzip_footer5
引用自:/var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so
预期于:平面名称空间
在/var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so中


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

in.push(boost::iostreams::gzip_decompressor());


更具体地说,gzip_decompressor()似乎是根本原因。如果我尝试gzip_compressor(),则该程序可以正常运行(除非我只是在屏幕上出现了二进制乱码)。

查看BH代码,我确认gzip_decompressor代码应该在该位置。

感谢您的任何帮助。

更新

遵循Dirk和nrussell的建议,这就是我解决问题的方式。

here下载的增强。

阅读说明here

打开包装,然后运行以下命令:

./bootstrap.sh --help


阅读说明,并确定我只需要编译IOstream。因此,运行以下命令:

./bootstrap.sh --with-libraries=iostreams
./b2


找出编译器查找库的路径。我敢肯定有一种更聪明的方法,但是我在R提示符下运行了以下命令:

Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)


在随后的文本中,注意到路径中有“ / usr / local / lib”。因此,在命令提示符下,我以正确的路径创建了到库的链接:

ln -s /Users/andersgs/Downloads/boost_1_58_0/stage/lib/libboost_iostreams.dylib /usr/local/lib/


显然,这以后需要纠正,因为它不会保留在“下载”文件夹中。

然后,遵照Dirk的指示,并得到nrussell的推荐。所以,回到R:

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


成功!!!正确编译。也可以。

谢谢你们俩。

安德斯

最佳答案

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

如果没有,则需要确保提供正确的链接参数-请参见Rcpp Gallery example on Boost regex的示例。

09-06 12:59