C++ BOOST undefined reference to `boost::filesystem::detail::copy_file

拟墨画扇 提交于 2019-12-18 03:11:30

问题


I have no clue why boost::filesystem::copy_file is making trouble for me.

undefined reference to `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;
}

I got no inspiration from the source code of boost or its 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);}

Even such a simple example does not work for me.

Platform: Linux Ubuntu 64


回答1:


There is a workaround for this problem, replace

#include <boost/filesystem.hpp>

with

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

Or, preferably, add -DBOOST_NO_CXX11_SCOPED_ENUMS to your compiler flags




回答2:


If you run into this problem make sure to include both -lboost_system and -lboost_filesystem in your call to g++

Example working 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)

Example working code

#include <boost/filesystem.hpp>

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



回答3:


I could not compile a file that included the header boost/filesystem.hpp either. This is how I solved it: I commented out the line boost/filesystem.hpp and all the lines that were using Boost, and then compiled the file. I then uncommented all the lines in the files and compiled again, and then it worked. I was compiling with the flag -lboost_system both times!



来源:https://stackoverflow.com/questions/35007134/c-boost-undefined-reference-to-boostfilesystemdetailcopy-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!