【问题标题】:C++ Boost: undefined reference to boost::system::generic_category()C++ Boost:对 boost::system::generic_category() 的未定义引用
【发布时间】:2012-11-08 03:47:55
【问题描述】:

我正在尝试在我的项目中包含 Boost 库,并且一直面临同样的问题。我在带有 Codeblocks IDE 的 Ubuntu 12.10 上,并尝试手动安装库,从站点读取说明,但在标头和使用前构建的库中出现错误。

然后我通过终端sudo apt-get install libboost-all-dev 安装了这些库。之后,在我的代码块程序中,我可以包含像 #include <boost/regex.hpp> 这样的标头,但是当我尝试包含文件系统库的标头(#include "boost/filesystem/operations.hpp")时,我收到以下错误:

/usr/include/boost/system/error_code.hpp|214|undefined reference to boost::system::generic_category()'|

我不确定如何解决此错误(特别是在 Linux 上的 Codeblocks 中)。我真的可以在这里得到一些帮助。

编译器:GCC
程序代码:仅尝试包含上述文件系统operations.hpp文件。

从代码块构建日志:

Build started on: 20-11-2012 at 18:02.53
Build ended on: 20-11-2012 at 18:02.54
-------------- Build: Debug in libopenFrameworks ---------------
Target is up to date.
-------------- Build: Debug in reader1 ---------------
make -s -f Makefile Debug
linking i686 bin/reader1_debug linux
obj/i686Debug/src/testApp.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
obj/i686Debug/src/main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
make: *** [bin/reader1_debug] Error 1
Process terminated with status 2 (0 minutes, 1 seconds)
6 errors, 0 warnings

【问题讨论】:

  • 你没有正确链接它,与你的系统路径和系统存储库不同,代码块不会为你做这件事,
  • @pyCthon:在这种情况下,您能否添加更多关于如何在 Code::blocks 中链接的详细信息。我尝试在设置中的某个位置添加链接器标志-lboost_system,但没有解决。但是,我什至不确定我是否在正确的位置做了整个链接器标志。多一点细节会有很大帮助。
  • 那么您使用的是什么编译器?鸣?海合会?你想运行什么代码?举个例子.....
  • @pyCthon:编译器是 Gcc。直到现在我还没有写过任何代码,但是尝试过包含Boost filesystem library(上面帖子中的operation.hpp)
  • 它是否可以使用 g++ 从命令行编译带有 boost 文件系统库的常规程序?

标签: c++ linux boost codeblocks


【解决方案1】:

您应该在libboost_system 库中链接。我不确定代码块,但您平台上的 g++ 命令行选项将是

-lboost_system

【讨论】:

  • 我已经找到了要添加的链接器标志。无法让它在代码块中工作。
  • @Cipher你能获取codeblocks执行的build和link命令吗?
  • @Cipher 抱歉,pastebin 在工作时被阻止。我可以稍后查看,但需要几个小时。
  • 没问题。也在帖子中更新了
  • 我和 Cipher 有同样的问题,就我而言,我处理的是 boost/asio.hpp。我在尝试编译时收到这些错误s1.directupload.net/images/130608/koyvqpdp.jpg。当我尝试添加 -lboost_system 时,它说“找不到 lboost_system”。什么问题?
【解决方案2】:

根据 boost 版本,libboost-system 带有 -mt 后缀,应该表示库的多线程能力。

如果链接器找不到-lboost_system,请尝试-lboost_system-mt

【讨论】:

  • 之所以有效,是因为对于这些 boost 版本,实际的库文件名有一个 -mt 后缀。
【解决方案3】:

这是一个链接器问题。将静态库路径包含到您的项目中。

对于 Qt Creator,打开项目文件 .pro 并添加以下行:

LIBS += -L<path for boost libraries in the system> -lboost_system

在我的情况下是 Ubuntu x86_64:

LIBS += -L/usr/lib/x86_64-linux-gnu -lboost_system

对于代码块,打开 Settings-&gt;Compiler...-&gt;Linker 设置选项卡并添加:

boost_system

到链接库文本小部件,然后按 OK 按钮。

【讨论】:

    【解决方案4】:

    我也搜索了一个解决方案,我遇到的答案都没有解决这个错误,直到我找到这个帖子的“ViRuSTriNiTy”的答案:Undefined reference to 'boost::system::generic_category()'?

    根据该答案,尝试将这些行添加到您的 cmake 文件中:

    find_package(Boost 1.55.0 REQUIRED COMPONENTS system filesystem)
    include_directories(... ${Boost_INCLUDE_DIRS})
    link_directories(... ${Boost_LIBRARY_DIRS})
    target_link_libraries(... ${Boost_LIBRARIES})
    

    【讨论】:

      【解决方案5】:

      这个answer 在使用 Boost 和 cmake 时确实有所帮助。

      为 cmake 文件添加add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)

      我的 CMakeLists.txt 如下所示:

      cmake_minimum_required(VERSION 3.12)
      project(proj)
      
      set(CMAKE_CXX_STANDARD 17)
      
      
      set(SHARED_DIR "${CMAKE_SOURCE_DIR}/../shared")
      
      set(BOOST_LATEST_DIR            "${SHARED_DIR}/boost_1_68_0")
      set(BOOST_LATEST_BIN_DIR        "${BOOST_LATEST_DIR}/stage/lib")
      set(BOOST_LATEST_INCLUDE_DIR    "${BOOST_LATEST_DIR}/boost")
      set(BOOST_SYSTEM                "${BOOST_LATEST_BIN_DIR}/libboost_system.so")
      set(BOOST_FS                    "${BOOST_LATEST_BIN_DIR}/libboost_filesystem.so")
      set(BOOST_THREAD                "${BOOST_LATEST_BIN_DIR}/libboost_thread.so")
      
      set(HYRISE_SQL_PARSER_DIR           "${SHARED_DIR}/hyrise_sql_parser")
      set(HYRISE_SQL_PARSER_BIN_DIR       "${HYRISE_SQL_PARSER_DIR}")
      set(HYRISE_SQL_PARSER_INCLUDE_DIR   "${HYRISE_SQL_PARSER_DIR}/src")
      set(HYRISE_SQLPARSER                "${HYRISE_SQL_PARSER_BIN_DIR}/libsqlparser.so")
      
      
      include_directories(${CMAKE_SOURCE_DIR} ${BOOST_LATEST_INCLUDE_DIR} ${HYRISE_SQL_PARSER_INCLUDE_DIR})
      
      set(BOOST_LIBRARYDIR "/usr/lib/x86_64-linux-gnu/")
      set(Boost_USE_STATIC_LIBS OFF)
      set(Boost_USE_MULTITHREADED ON)
      set(Boost_USE_STATIC_RUNTIME OFF)
      
      add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
      
      find_package(Boost 1.68.0 REQUIRED COMPONENTS system thread filesystem)
      
      add_executable(proj main.cpp row/row.cpp row/row.h table/table.cpp table/table.h page/page.cpp page/page.h
              processor/processor.cpp processor/processor.h engine_instance.cpp engine_instance.h utils.h
              meta_command.h terminal/terminal.cpp terminal/terminal.h)
      
      
      if(Boost_FOUND)
          include_directories(${Boost_INCLUDE_DIRS})
          target_link_libraries(proj PUBLIC Boost::system Boost::filesystem Boost::thread ${HYRISE_SQLPARSER})
      endif()
      

      【讨论】:

        【解决方案6】:

        在构建一个简单的 boost 示例时遇到同样的问题,在我将 g++ 编译器标志从 -std=c++14 更改为 -std=c++11 后解决.

        我注意到这是一个 C++11 示例...

        【讨论】:

        • 这解决了我的问题。很容易忘记编译期间使用的标志,特别是在使用默认标志时。
        【解决方案7】:

        我有同样的问题,也使用 Linux Mint (as nuduoz) 。在我将boost_system 添加到GCC C++ Linker-&gt;Libraries 后,我的案例问题得到了解决。

        【讨论】:

          【解决方案8】:

          您可能会遇到另一个问题。在 Linux Mint 上安装 Boost 后,我​​遇到了同样的问题。链接 -lboost_system-lboost_system-mt 无效,因为库的名称为 libboost_system.so.1.54.0

          所以解决方案是创建指向原始文件的符号链接。就我而言

          sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 /usr/lib/libboost_system.so
          

          有关更多信息,请参阅this 问题。

          【讨论】:

            【解决方案9】:

            如果没有安装库,你应该给 boost 库文件夹:

            示例:

            g++ -L/usr/lib/x86_64-linux-gnu -lboost_system -lboost_filesystem prog.cpp -o prog

            【讨论】:

              【解决方案10】:

              试试

              g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out 
              

              /usr/lib/x86_64-linux-gnu/是boost库的位置

              使用find /usr/ -name '*boost*.so' 查找 boost 库位置

              【讨论】:

                【解决方案11】:

                g++ -lboost_system -lboost_filesystem userentry.cpp -o userentry

                在 debian 下完美运行。 (使用 apt-get 安装的 boost c++ 库)。

                【讨论】:

                  【解决方案12】:

                  在测试了上述建议的解决方案后,我发现只有这几行可行。

                  我使用的是 Ubuntu 16.04。

                  cmake_minimum_required(版本 3.13)
                  项目(我的项目)

                  设置(CMAKE_CXX_STANDARD 11)
                  add_executable(myProject main.cpp)

                  find_package(Boost 1.58.0 REQUIRED COMPONENTS系统文件系统)
                  target_link_libraries(myProject ${Boost_LIBRARIES})

                  【讨论】:

                    【解决方案13】:

                    在我的项目中,我更喜欢使用仅标头库。所以上面没有任何帮助。真正有帮助的是:

                    add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)
                    

                    【讨论】:

                      最近更新 更多