webentwicklung-frage-antwort-db.com.de

C++ BOOST undefined Verweis auf `boost :: filesystem :: detail :: copy_file

Ich habe keine Ahnung, warum boost::filesystem::copy_file mir Probleme macht.

undefinierter Verweis auf `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;
}

Der Quellcode von boost oder sein 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);}

Selbst ein solches einfaches Beispiel funktioniert für mich nicht.

Plattform: Linux Ubuntu 64

14
ar2015

Es gibt eine Problemumgehung für dieses Problem, zu ersetzen

#include <boost/filesystem.hpp>

mit

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

Oder fügen Sie Ihren Compiler-Flags vorzugsweise -DBOOST_NO_CXX11_SCOPED_ENUMS hinzu

14
J.J. Hakala

Wenn Sie auf dieses Problem stoßen, müssen Sie unbedingt -lboost_system und -lboost_filesystem in Ihren Aufruf von g ++ aufnehmen

Beispiel für ein 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)

Beispiel Arbeitscode

#include <boost/filesystem.hpp>

void create_data_file(std::string file_path)
{
    boost::filesystem::path p(file_path);
    boost::filesystem::create_directory(p);
}
3
lukejkw

Ich konnte auch keine Datei kompilieren, die den Header boost/filesystem.hpp enthielt. So habe ich es gelöst: Ich habe die Zeile boost/filesystem.hpp und alle Zeilen, die Boost verwendet haben, auskommentiert und dann die Datei kompiliert. Ich habe dann alle Zeilen in den Dateien auskommentiert und erneut kompiliert, und dann hat es funktioniert. Ich habe beide Male mit der Flagge -lboost_system kompiliert!

1
Niclas Jonsson