C ++ BOOST对`boost :: filesystem :: detail :: copy_file的未定义引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ BOOST对`boost :: filesystem :: detail :: copy_file的未定义引用相关的知识,希望对你有一定的参考价值。

我不知道为什么boost::filesystem::copy_file为我制造麻烦。

未定义的引用`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;
}

我从boost或其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);}

甚至这样的simple example也不适合我。

平台:Linux Ubuntu 64

答案

这个问题有一个解决方法,替换

#include <boost/filesystem.hpp>

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

或者,最好将-DBOOST_NO_CXX11_SCOPED_ENUMS添加到编译器标志中

另一答案

如果遇到这个问题,请确保在调用g ++时同时包含-lboost_system-lboost_filesystem

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);
}
另一答案

我无法编译包含标头boost/filesystem.hpp的文件。这就是我解决它的方法:我注释掉了boost/filesystem.hpp行和所有使用Boost的行,然后编译了文件。然后我取消注释文件中的所有行并再次编译,然后它工作。我两次都在用-lboost_system国旗进行编译!

以上是关于C ++ BOOST对`boost :: filesystem :: detail :: copy_file的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

boost interprocess file_lock 实际上对目标文件做了啥?

解决 Boost安装:fatal error: bzlib.h: No such file or directory 问题

使用简单 Ls.cpp 的 C++ Boost 编译错误 - 未定义对 boost::filesystem::path::filename 的引用

BOOST库c ++的问题

为什么没有boost :: filesystem :: move_file?

boost::interprocess::managed_mapped_file 如何包含弹性向量?