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

2024-10-24 08:50:00
admin
原创
324
摘要:问题描述:我正在尝试将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})
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用