gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:38:41 24 4
gpt4 key购买 nike

我希望从 .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")

我收到以下错误:

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 下载 boost .

阅读说明 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”在路径中。因此,在命令提示符下,我在正确的路径中创建了一个指向库的链接:
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有一个有效的例子。

关于使用 boost::iostreams::gzip_decompress 时,rcpp 代码无法使用 boost 库加载(如在 BH 中实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30520776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com