101

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

然后我通过 terminalby 安装了这些库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
4

13 回答 13

150

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

-lboost_system

于 2012-11-20T07:17:37.840 回答
21

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

因此,如果-lboost_system链接器无法找到 try -lboost_system-mt

于 2013-09-02T08:07:23.723 回答
9

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

对于 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->Compiler...->Linker设置选项卡并添加:

boost_system

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

于 2015-06-02T22:30:13.593 回答
8

我也搜索了一个解决方案,但我遇到的答案都没有解决这个错误,直到我找到这个线程的“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})
于 2016-09-29T07:54:32.353 回答
8

这个答案在使用 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()
于 2018-10-10T09:52:47.427 回答
4

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

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

于 2018-08-16T15:10:56.240 回答
3

我有同样的问题,也使用 Linux Mint (as nuduoz) 。我添加boost_systemGCC C++ Linker->Libraries.

于 2015-08-26T10:11:57.460 回答
1

你可能会遇到另一个问题。在 Linux Mint 上安装 Boost 后,我​​遇到了同样的问题。链接-lboost_system-lboost_system-mt没有工作,因为库有 name 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

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

于 2015-02-14T14:22:27.797 回答
1

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

例子:

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

于 2018-10-08T20:13:08.843 回答
0

尝试

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

于 2015-08-02T22:38:22.467 回答
0

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

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

于 2018-10-08T19:57:19.853 回答
0

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

我正在使用 Ubuntu 16.04。

cmake_minimum_required(版本 3.13)
项目(myProject)

设置(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})

于 2019-04-19T17:23:02.090 回答
0

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

add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)
于 2021-11-08T21:38:45.270 回答