【问题标题】:C++ BOOST undefined reference to `boost::filesystem::detail::copy_fileC++ BOOST 未定义引用`boost::filesystem::detail::copy_file
【发布时间】:2016-05-02 14:53:11
【问题描述】:

我不知道为什么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

【问题讨论】:

标签: c++ boost linker-errors boost-filesystem


【解决方案1】:

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

#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 添加到您的编译器标志中

【讨论】:

  • 用这段代码替换什么? boost/filesystem.hpp 已包含在内。
  • 这只是乞求违反 ODR。如果你要定义BOOST_NO_CXX11_SCOPED_ENUMS,你需要在全局范围内定义它。
  • 一定要使用-DBOOST_NO_CXX11_SCOPED_ENUMS,因为boost_filesystem 库无论如何都缺少作用域枚举实现,所以使用其他方法几乎没有意义。它也很容易错过包含,并且可能还有其他使用包含的 boost 库。无论哪种方式,感谢您的帖子 - 它肯定有帮助。
【解决方案2】:

如果您遇到此问题,请确保在您对 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)

示例工作代码

#include <boost/filesystem.hpp>

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

【讨论】:

  • 如果这不起作用并且人们不阅读其他帖子添加标志-DBOOST_NO_CXX11_SCOPED_ENUMS 将起作用。见 J J Hakalas 帖子。
  • 这对我有用!我是 VSCode 下的 g++ 新手,还没有准备好应对复杂的 makefile。但是在这篇文章的基础上,我只是将 "-lboost_system","-lboost_filesystem", 两行添加到文件 tasks.json (在 "-o", 行之前),突然我所有的(链接器?)错误消息都消失了。非常感谢!
  • 这对我来说不适用于 copy_file() (我之前已经在 -lboost_file_system 前面使用过 -lboost_system )。使用-std=c++11后出现问题。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    在旧的 bo​​ost 版本中,它是 BOOST_NO_SCOPED_ENUMS,而不是 BOOST_NO_CXX11_SCOPED_ENUMS

    boost::filesystem::copy_file() missing symbol in c++11

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      相关资源
      最近更新 更多