使用 boost::iostreams::gzip_decompress 时,rcpp 代码无法加载 boost 库(在 BH 中实现)
rcpp codes fails to load with boost library (as implemented in BH) when using boost::iostreams::gzip_decompress
我想从 .bz 文件中读取数据。我正在尝试使用 BH 库使用 rcpp 和 boost 来完成它。我是 运行 MacOSX 10.10.3 上的 R 3.2.0、Rcpp 版本 0.11.6 和 BH 1.58.0-1。
到目前为止,这是我的代码:
// [[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")
我收到以下错误:
Error in dyn.load("/var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so") :
unable to load shared object '/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): Symbol not found: __ZN5boost9iostreams6detail11gzip_footer5resetEv
Referenced from: /var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so
Expected in: flat namespace
in /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
阅读说明,决定我只需要编译 IOstreams。所以,运行 如下:
./bootstrap.sh --with-libraries=iostreams
./b2
找出编译器查找库的路径。我确信有一种更聪明的方法可以做到这一点,但我 运行 R 提示符中的以下内容:
Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
从随后的文本中,注意到“/usr/local/lib”在路径中。因此,在命令提示符下,我在正确的路径中为库创建了一个 link:
ln -s /Users/andersgs/Downloads/boost_1_58_0/stage/lib/libboost_iostreams.dylib /usr/local/lib/
这显然需要稍后更正,因为它不会保留在我的“下载”文件夹中。
然后,在 nrussell 的推荐下,按照德克的指示进行操作。所以,回到 R:
Sys.setenv("PKG_LIBS"="-lboost_iostreams")
Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
成功!!!编译正确。也有效。
谢谢你们。
安德斯
您确定这有效吗"headers-only"?
如果没有,您需要确保提供正确的 link 参数——请参阅 Rcpp Gallery example on Boost regex 有一个有效的示例。
我想从 .bz 文件中读取数据。我正在尝试使用 BH 库使用 rcpp 和 boost 来完成它。我是 运行 MacOSX 10.10.3 上的 R 3.2.0、Rcpp 版本 0.11.6 和 BH 1.58.0-1。
到目前为止,这是我的代码:
// [[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")
我收到以下错误:
Error in dyn.load("/var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so") : unable to load shared object '/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): Symbol not found: __ZN5boost9iostreams6detail11gzip_footer5resetEv Referenced from: /var/folders/sv/rhmpnyt91kdb10d1hnz_zd1c0000gn/T//RtmpZiCsVD/sourcecpp_40e63686ad7f/sourceCpp_9777.so Expected in: flat namespace in /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
阅读说明,决定我只需要编译 IOstreams。所以,运行 如下:
./bootstrap.sh --with-libraries=iostreams
./b2
找出编译器查找库的路径。我确信有一种更聪明的方法可以做到这一点,但我 运行 R 提示符中的以下内容:
Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
从随后的文本中,注意到“/usr/local/lib”在路径中。因此,在命令提示符下,我在正确的路径中为库创建了一个 link:
ln -s /Users/andersgs/Downloads/boost_1_58_0/stage/lib/libboost_iostreams.dylib /usr/local/lib/
这显然需要稍后更正,因为它不会保留在我的“下载”文件夹中。
然后,在 nrussell 的推荐下,按照德克的指示进行操作。所以,回到 R:
Sys.setenv("PKG_LIBS"="-lboost_iostreams")
Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
成功!!!编译正确。也有效。
谢谢你们。
安德斯
您确定这有效吗"headers-only"?
如果没有,您需要确保提供正确的 link 参数——请参阅 Rcpp Gallery example on Boost regex 有一个有效的示例。