C++ BOOST 未定义对 'boost::filesystem::d etail::copy_file 的引用

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

本文关键字:copy etail file 引用 filesystem C++ 未定义 boost BOOST      更新时间:2023-10-16
我不知道

boost::filesystem::copy_file为什么要给我制造麻烦。

未定义对'boost::文件系统::d etail::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 的源代码或其帮助中获得灵感:

  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);}

即使是这样简单的例子也不适合我。

平台: 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

示例工作生成文件

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)

示例工作代码

#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编译!

在较旧的加速版本中,它是 BOOST_NO_SCOPED_ENUMS ,而不是BOOST_NO_CXX11_SCOPED_ENUMS

请参阅 boost::文件系统::copy_file() 缺少 C++11 中的符号