2016-01-26 24 views
13

Non ho idea del perché boost::filesystem::copy_file stia creando problemi per me.C++ BOOST riferimento undefined a `boost :: filesystem :: detail :: copy_file

undefined reference to `boost :: filesystem :: dettaglio :: copy_file

// g++ -std=c++11 test.cpp -lboost_filesystem -lboost_system -lrt -lboost_wave 

#include <boost/filesystem.hpp> 

int main() 
{ 

    boost::filesystem::create_directory("aaa"); 
    // ok 


    boost::filesystem::copy_file("f1","f2"); 
    // /tmp/ccNWZltB.o: In function `boost::filesystem::copy_file(boost::filesystem::path const&, boost::filesystem::path const&)': 
    // test.cpp:(.text._ZN5boost10filesystem9copy_fileERKNS0_4pathES3_[_ZN5boost10filesystem9copy_fileERKNS0_4pathES3_]+0x26): undefined reference to `boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*)' 
    // collect2: error: ld returned 1 exit status 


    return 0; 
} 

ho ricevuto alcuna ispirazione dal codice sorgente di amplificazione o la sua help:

inline 
    void copy_file(const path& from, const path& to, // See ticket #2925 
       BOOST_SCOPED_ENUM(copy_option) option, system::error_code& ec) 
             {detail::copy_file(from, to, option, &ec);} 

Anche un tale simple example non funziona per me.

Piattaforma: Linux Ubuntu 64

+0

Senza '-std = C++ 11' viene compilato? –

+1

non lo fa. Ho appena trovato [questo bug] (https://svn.boost.org/trac/boost/ticket/10038) – ar2015

+0

che scaricherò e controllerà la nuova versione. – ar2015

risposta

14

C'è una soluzione per questo problema, sostituire

#include <boost/filesystem.hpp> 

con

#define BOOST_NO_CXX11_SCOPED_ENUMS 
#include <boost/filesystem.hpp> 
#undef BOOST_NO_CXX11_SCOPED_ENUMS 

o, preferibilmente, aggiungi -DBOOST_NO_CXX11_SCOPED_ENUMS ai tuoi flag di compilazione

+0

Cosa sostituire con questo codice? 'boost/filesystem.hpp' è già incluso. – ar2015

+2

Questo è solo l'accattonaggio per violazioni ODR. Se stai per definire 'BOOST_NO_CXX11_SCOPED_ENUMS' devi definirlo a livello globale. – ildjarn

0

I impossibile compilare un file che includ anche l'intestazione boost/filesystem.hpp. Ecco come ho risolto: ho commentato la riga boost/filesystem.hpp e tutte le righe che stavano usando Boost, e poi ho compilato il file. Ho quindi decommentato tutte le righe nei file e compilato di nuovo, e poi ha funzionato. Stavo compilando con la bandiera -lboost_system entrambe le volte!