2015-05-29 25 views
5

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.

+0

W oparciu o odpowiedź @Dirk Eddelbuettel, prawdopodobnie musisz przekazać kompilator '-lboost_iostreams'. – nrussell

Odpowiedz

3

Czy jesteś pewien, że działa to tylko "nagłówek"?

Jeśli nie, musisz upewnić się, że podajesz odpowiednie argumenty - patrz Rcpp Gallery example on Boost regex.

+1

Dziękuję Dirk i nrussell. Nie zdawałem sobie sprawy, że niektóre z bibliotek nie są "tylko nagłówkowe" (lista tutaj dla zainteresowanych: [link] (http://www.boost.org/doc/libs/1_58_0/more/getting_started/unix-variants .html # header-only-libraries) Nie przeszedłem jeszcze, aby to działało, a ja nie mam jeszcze instalacji boost jeszcze (tylko BH) .Mogę zbadać alternatywy, ponieważ to może zrobić to też Skomplikowane dla ludzi do zainstalowania ewentualnego pakietu R. Nie mam dość "reputacji", by głosować w górę, więc zostawiam moją wdzięczność tylko w komentarzach. –