Chciałbym odczytać dane z pliku .bz. Próbuję to zrobić za pomocą rcpp plus boost przy użyciu biblioteki BH. Używam wersji 3.2.0 na MacOSX 10.10.3, Rcpp wersji 0.11.6 i BH 1.58.0-1.kodów rcpp nie można wczytać z biblioteką boost (jak zaimplementowano w BH), gdy używam boost :: iostreams :: gzip_decompress
Oto mój kod do tej pory:
// [[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);
}
Kiedy próbuję załadować kodu poprzez:
Rcpp::sourceCpp(file = "src/boost_test.cpp")
pojawia się następujący błąd:
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
przez niektórych usterek , problematyczna linia wydaje się być:
in.push(boost::iostreams::gzip_decompressor());
Wydaje się, że główną przyczyną jest gzip_decompressor()
. Jeśli spróbuję, gzip_compressor()
zamiast tego program działa poprawnie (z wyjątkiem tego, że po prostu dostaję binarny bełkot na ekranie).
Przeglądając kod BH, potwierdziłem, że kod gzip_decompressor
jest tam, gdzie powinien.
Dziękuję za pomoc.
UPDATE
następstwie sugestii Dirk i nrussell, to w jaki sposób rozwiązać ten problem.
Pobrane wzmocnienie z here.
Przeczytaj instrukcję here.
rozpakowany, a prowadził następujące:
./bootstrap.sh --help
przeczytać instrukcję i postanowił mi tylko potrzebny do kompilacji iostreams. Tak więc uruchomiono następujące:
./bootstrap.sh --with-libraries=iostreams
./b2
Wykreślono ścieżkę, na której kompilator szuka bibliotek. Jestem pewien, że istnieje lepszy sposób to zrobić, ale wpadłem następujące z wiersza R:
Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
z poniższego tekstu, zauważył, że „/ usr/local/lib” był w drodze. Tak więc, z wiersza poleceń, stworzyłem link do biblioteki w prawidłowej ścieżce:
ln -s /Users/andersgs/Downloads/boost_1_58_0/stage/lib/libboost_iostreams.dylib /usr/local/lib/
To oczywiście muszą zostać poprawione później, gdyż nie będzie pobyt w moim folderze Pobrane.
Następnie, postępuj zgodnie z instrukcjami Dirka, z zaleceniem nrussell. Z powrotem w R:
Sys.setenv("PKG_LIBS"="-lboost_iostreams")
Rcpp::sourceCpp('src/boost_test.cpp', verbose = T, rebuild = T)
Sukces !!! Poprawnie skompilowane. Działa również.
Dziękuję wam obojgu.
Anders.
W oparciu o odpowiedź @Dirk Eddelbuettel, prawdopodobnie musisz przekazać kompilator '-lboost_iostreams'. – nrussell