2015-05-29 16 views
5

Desidero leggere i dati da un file .bz. Sto cercando di farlo usando rcpp plus boost usando la libreria BH. Sto usando R 3.2.0 su MacOSX 10.10.3, Rcpp versione 0.11.6 e BH 1.58.0-1.rcpp non vengono caricati con la libreria boost (come implementato in BH) quando si utilizza boost :: iostreams :: gzip_decompress

Ecco il mio codice finora:

// [[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); 
} 

Quando provo a caricare il codice tramite:

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

ottengo il seguente errore:

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

Per qualche risoluzione dei problemi , la linea problematica sembra essere:

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

In particolare, gzip_decompressor() sembra essere la causa principale. Se provo il gzip_compressor(), invece il programma funziona bene (eccetto che ho solo un bindo binario sullo schermo).

Guardando attraverso il codice BH, ho confermato che il codice gzip_decompressor è dove dovrebbe essere.

Grazie per qualsiasi aiuto.

UPDATE

Seguendo i suggerimenti da Dirk e nrussell, questo è come ho risolto il problema.

Boost scaricato da here.

Leggere le istruzioni here.

Unpacked, e corse il seguente:

./bootstrap.sh --help 

Leggere le istruzioni, e ho deciso che solo bisogno di compilare iostreams. Così, corse il seguente:

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

capito il percorso in cui il compilatore cerca le librerie. Sono sicuro che ci sia un modo più intelligente di farlo, ma mi sono imbattuto il seguente dal prompt R:

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

Dal testo che segue, ha notato che '/ usr/local/lib' era nel percorso. Così, dal prompt dei comandi, ho creato un link alla libreria nel percorso corretto:

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

Ciò, ovviamente, devono essere corretti in seguito, in quanto non sarà alloggiato nella mia cartella Download.

Quindi, ha seguito le istruzioni di Dirk, con la raccomandazione di nrussell. Quindi, di nuovo in R:

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

successo !!! Compilato correttamente Funziona anche

Grazie ad entrambi.

Anders.

+0

Basandosi sulla risposta di @Dirk Eddelbuettel, probabilmente si deve passare '-lboost_iostreams' al compilatore. – nrussell

risposta

3

Sei sicuro che funzioni "solo intestazioni"?

In caso contrario, è necessario assicurarsi di fornire gli argomenti di collegamento corretti - vedere Rcpp Gallery example on Boost regex ha un esempio funzionante.

+1

Grazie Dirk e nrussell. Non mi ero reso conto che alcune delle librerie non erano "solo intestazioni" (elencate qui per gli interessati: [link] (http://www.boost.org/doc/libs/1_58_0/more/getting_started/unix-variants .html # header-only-libraries). Non l'ho ancora fatto funzionare per farlo funzionare, e non ho ancora un'installazione boost (solo BH). Potrei esplorare alternative, dato che potrebbe farlo anche complicato per le persone che installano un eventuale pacchetto R. Non ho abbastanza "reputazione" per votare, quindi lascerò il mio apprezzamento solo nei commenti. –

Problemi correlati