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

ar2*_*015 20 c++ boost linker-errors boost-filesystem

我不知道为什么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;
}
Run Code Online (Sandbox Code Playgroud)

我从boost的源代码或它的帮助中得不到灵感:

  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);}
Run Code Online (Sandbox Code Playgroud)

即便是这样一个简单的例子对我也不起作用.

平台: Linux Ubuntu 64

J.J*_*ala 16

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

#include <boost/filesystem.hpp>
Run Code Online (Sandbox Code Playgroud)

#define BOOST_NO_CXX11_SCOPED_ENUMS
#include <boost/filesystem.hpp>
#undef BOOST_NO_CXX11_SCOPED_ENUMS
Run Code Online (Sandbox Code Playgroud)

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

  • 这只是乞求ODR违规行为.如果您要定义`BOOST_NO_CXX11_SCOPED_ENUMS`,则需要全局定义它. (2认同)
  • 绝对使用“-DBOOST_NO_CXX11_SCOPED_ENUMS”,使用其他方法没有什么意义,因为“boost_filesystem”库无论如何都缺少作用域枚举实现。它也很容易错过包含,并且可能还有其他使用该包含的 boost 库。不管怎样,谢谢你的帖子——它确实有帮助。 (2认同)

luk*_*jkw 7

如果您遇到此问题,请确保在对 g++ 的调用中同时包含-lboost_system-lboost_filesystem

示例工作 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)
Run Code Online (Sandbox Code Playgroud)

示例工作代码

#include <boost/filesystem.hpp>

void create_data_file(std::string file_path)
{
    boost::filesystem::path p(file_path);
    boost::filesystem::create_directory(p);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果这不起作用并且人们没有阅读其他帖子,添加标志`-DBOOST_NO_CXX11_SCOPED_ENUMS` 将起作用。见 JJ Hakalas 帖子。 (2认同)