2016-01-26 27 views
13

Nie mam pojęcia dlaczego boost::filesystem::copy_file sprawia mi kłopoty.C++ BOOST undefined odniesienie do `boost :: filesystem :: detail :: copy_file

niezdefiniowana odniesienia do systemu plików `boost :: :: szczegóły :: 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; 
} 

nie mam natchnienie z kodu źródłowego pobudzenia lub jego 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);} 

Nawet taki simple example nie działa dla mnie.

Platforma: Linux Ubuntu 64

+0

Bez '-std = C++ 11' kompiluje? –

+1

yest it does. Właśnie znalazłem [ten błąd] (https://svn.boost.org/trac/boost/ticket/10038) – ar2015

+0

Pobrałem i sprawdziłem nową wersję. – ar2015

Odpowiedz

14

Istnieje obejście tego problemu, wymień

#include <boost/filesystem.hpp> 

z

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

lub korzystnie dodać -DBOOST_NO_CXX11_SCOPED_ENUMS do flag kompilatora

+0

Co należy zastąpić tym kodem? 'boost/filesystem.hpp' jest już dołączony. – ar2015

+2

To tylko prośba o naruszenie praw ODR. Jeśli zamierzasz zdefiniować 'BOOST_NO_CXX11_SCOPED_ENUMS', musisz zdefiniować to globalnie. – ildjarn

0

I nie można skompilować pliku, który zawiera ed także nagłówek boost/filesystem.hpp. Tak to rozwiązałem: skomentowałem linię boost/filesystem.hpp i wszystkie linie, które używały funkcji Boost, a następnie skompilowałem plik. Następnie odkomentowałem wszystkie wiersze w plikach i skompilowałem ponownie, a następnie zadziałało. Przez cały czas kompilowałem flagę -lboost_system!