C++ Boost:对 boost::system::generic_category() 的未定义引用

2024-10-24 08:50:00
admin
原创
82
摘要:问题描述:我正在尝试将Boost库包含到我的项目中,但遇到了一些问题。我在 Ubuntu 12.10 上安装了 Codeblocks IDE,并尝试手动安装库,阅读网站上的说明,但遇到了标头错误以及使用前要构建的库错误。然后我通过 terminalby 安装了库sudo apt-get install lib...

问题描述:

我正在尝试将Boost库包含到我的项目中,但遇到了一些问题。我在 Ubuntu 12.10 上安装了 Codeblocks IDE,并尝试手动安装库,阅读网站上的说明,但遇到了标头错误以及使用前要构建的库错误。

然后我通过 terminalby 安装了库sudo apt-get install libboost-all-dev。此后,在我的 Codeblocks 程序中,我可以包含类似的标题#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文件。

从 Codeblocks 构建日志:

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

解决方案 1:

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

-lboost_系统

解决方案 2:

根据 boost 版本,libboost-system 带有 -mt 后缀,这表明该库具有多线程功能。

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

解决方案 3:

当使用 Boost 和 cmake 时,这个答案确实有帮助。

添加add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)cmake 文件。

我的 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()

解决方案 4:

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

对于 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

对于 Codeblocks,打开Settings->Compiler...->Linker设置选项卡并添加:

boost_system

到链接库文本小部件并按下OK按钮。

解决方案 5:

我也寻找解决方案,但遇到的所有答案都无法解决错误,直到我找到“ViRuSTriNiTy”对此线程的回答:对“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})

解决方案 6:

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

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

解决方案 7:

我也遇到了同样的问题,也使用 Linux Mint(作为 nuduoz)。我添加到后,我的情况问题得到了boost_system解决GCC C++ Linker->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

欲了解更多信息,请参阅此问题。

解决方案 9:

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

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

解决方案 10:

如果未安装该库,则应提供 boost 库文件夹:

例子:

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

解决方案 11:

尝试

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 库位置

解决方案 12:

在我的项目中,我更喜欢使用仅包含头文件的库。因此,上述内容毫无帮助。真正有帮助的是:

add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)

解决方案 13:

在测试了上面描述的解决方案之后,我发现只有这几行有效。

我正在使用 Ubuntu 16.04。

cmake_minimum_required(VERSION 3.13)  
project(myProject)  

set(CMAKE_CXX_STANDARD 11)  
add_executable(myProject main.cpp)  

find_package(Boost 1.58.0 REQUIRED COMPONENTS system filesystem)  
target_link_libraries(myProject ${Boost_LIBRARIES})
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用