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


92

我试图将Boost库包含在我的项目中,并且一直面临着同样的问题。我在使用Codeblocks IDE的Ubuntu 12.10上,尝试手动读取站点上的说明来安装库,但是标头以及使用前要构建的库出现错误。

然后,我通过terminalby安装了库sudo apt-get install libboost-all-dev。此后,在我的代码块程序中,可以包含类似的标题,#include <boost/regex.hpp>但是当我尝试包含Filesystem库的标题(#include "boost/filesystem/operations.hpp" )时,出现以下错误:

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

我不确定如何解决此错误(特别是在Linux上的代码块中)。我真的可以在这里使用一些帮助。

编译器: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 2012年

@pyCthon:在这种情况下,您可以添加更多详细信息吗?如何在Code :: blocks中链接此信息?我尝试-lboost_system在设置中的某个位置添加链接器标志,但没有解决。但是,我什至不确定是否在正确的地方完成了整个链接器标记。多一点细节将有很大帮助。
密码

那么您正在使用什么编译器?Mingw?gcc?您想运行什么代码?举个例子..
pyCthon'n

@pyCthon:Comiler是Gcc。到目前为止,我还没有编写任何代码,但是尝试过包括Boost filesystem library(上述文章中的operation.hpp)
Cipher

用g ++从命令行编译带有boost文件系统库的常规程序能正常工作吗?
pyCthon 2012年

Answers:


141

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

-lboost_system


我已经找到了要添加的链接器标志。无法使其在代码块中工作。
密码

@Cipher您可以获得代码块执行的build和link命令吗?
juanchopanza 2012年

@Cipher抱歉,pastebin在工作中被阻止。我可以稍后检查,但需要几个小时。
juanchopanza 2012年

没问题。帖子中也进行了更新
Cipher 2012年

我有和Cipher相同的问题,就我而言,我处理的是boost / asio.hpp。尝试编译时出现这些错误s1.directupload.net/images/130608/koyvqpdp.jpg。当我尝试添加-lboost_system时,它说“找不到lboost_system”。有什么问题?
ddacot

21

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

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


1
之所以起作用,是因为对于这些增强版本,实际的库文件名都带有-mt后缀。
tssch

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按钮。


7

我也搜索了一个解决方案,但遇到的所有答案都未能解决该错误,直到找到该线程的“ 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})

5

当使用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

在构建一个简单的boost示例时,出现了同样的问题,在将g ++编译器标志从-std = c ++ 14更改为-std = c ++ 11之后,该问题得以解决。

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


那解决了我的问题。忘记在编译过程中使用的标志是很容易的,特别是当您使用默认标志时。
菲利普·卡拉桑斯

3

我有同样的问题,也使用Linux Mint(如nuduoz)。我加入以后,案件问题就解决boost_systemGCC C++ Linker->Libraries


1

您可能会遇到另一个问题。在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

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


1

如果未安装该库,则应给boostbos文件夹:

例:

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


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'查找增强库的位置


0

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

在debian下运作良好。(增强与apt-get一起安装的c ++库)。


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需要的组件系统文件系统)
target_link_libraries(myProject $ {Boost_LIBRARIES})

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.