C++ BOOST référence non définie à ' boost:: filesystem:: détail:: copy file

je n'ai aucune idée de pourquoi boost::filesystem::copy_file est problème pour moi.

référence non définie à ' boost:: filesystem:: detail:: 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;
}

je n'ai pas d'inspiration à partir du code source de boost ou de ses 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);}

Même exemple simple ne fonctionne pas pour moi.

Plate-forme: Linux Ubuntu 64

14
demandé sur ar2015 2016-01-26 07:36:37

3 réponses

il y a une solution pour contourner ce problème, remplacer

#include <boost/filesystem.hpp>

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

Ou, de préférence, ajouter -DBOOST_NO_CXX11_SCOPED_ENUMS pour vos drapeaux du compilateur

13
répondu J.J. Hakala 2016-11-18 09:46:16

Je n'ai pas pu compiler un fichier qui incluait l'en-tête boost/filesystem.hpp soit. C'est comment je l'ai résolu: j'ai commenté la ligne boost/filesystem.hpp et toutes les lignes qui utilisaient Boost, puis compilaient le fichier. J'ai alors décommenté toutes les lignes dans les fichiers et compilé à nouveau, et puis ça a fonctionné. J'ai été la compilation avec le drapeau -lboost_system les deux fois!

1
répondu Niclas Jonsson 2017-08-10 11:15:23

Si vous rencontrez ce problème, assurez-vous d'inclure à la fois -lboost_system et -lboost_filesystem dans votre appel à g++

exemple de travail Makefile

BINARY = output
FILE_OBJECTS = main.o fileLoader.o
BOOST = -lboost_system -lboost_filesystem
GCC = g++ -std=c++17
FLAGS = -Wall -pedantic -Wextra

build: $(FILE_OBJECTS)
    $(GCC) $(FLAGS) $(FILE_OBJECTS) -o $(BINARY) $(BOOST)

main.o: main.cpp fileLoader.o
    $(GCC) $(FLAGS) -c main.cpp

fileLoader.o: fileLoader.cpp
    $(GCC) $(FLAGS) -c fileLoader.cpp

clean:
    rm -rf *.o $(BINARY)

exemple de code de travail

#include <boost/filesystem.hpp>

void create_data_file(std::string file_path)
{
    boost::filesystem::path p(file_path);
    boost::filesystem::create_directory(p);
}
1
répondu lukejkw 2018-05-26 13:09:04