C++ Boost:对 boost::system::generic_category() 的未定义引用
- 2024-10-24 08:50:00
- admin 原创
- 83
问题描述:
我正在尝试将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})
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件