我正在尝试将Boost
库包含在我的项目中,并且一直面临着相同的问题。我在使用Codeblocks IDE的Ubuntu 12.10上,尝试手动从站点读取指令来安装库,但是在使用头文件以及使用前构建的库时出现了错误。
然后我通过terminalby sudo apt-get install libboost-all-dev
安装了库。在此之后,在我的Codeblocks程序中,我可以包含#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上的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
答案 0 :(得分:130)
您应该在libboost_system
库中进行链接。我不确定代码块,但是你平台上的g ++命令行选项是
-lboost_system
答案 1 :(得分:20)
根据boost版本的不同,libboost-system附带-mt后缀,它应该表明库的多线程功能。
因此,如果链接器找不到-lboost_system
,请尝试-lboost_system-mt
。
答案 2 :(得分:8)
这是一个链接器问题。将静态库路径包含在项目中。
对于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
链接库文本小部件,然后按确定按钮。
答案 3 :(得分:7)
我也搜索了一个解决方案,我遇到的答案都没有解决错误,直到我找到了“ViRuSTriNiTy”的答案:Undefined reference to '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})
答案 4 :(得分:3)
关于构建一个简单的boost示例的相同问题,在将g ++编译器标志从 -std = c ++ 14 更改为 -std = c ++ 11 后解决了
我注意到这是一个C ++ 11示例...
答案 5 :(得分:2)
此answer实际上在使用Boost和cmake时有所帮助。
为cmake文件添加add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
。
我的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()
答案 6 :(得分: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
有关详细信息,请参阅this问题。
答案 7 :(得分:1)
我有同样的问题,也使用Linux Mint(作为nuduoz)。我将boost_system
添加到GCC C++ Linker->Libraries
后解决了我的案例问题。
答案 8 :(得分: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/
是升级库的位置
使用find /usr/ -name '*boost*.so'
查找提升库位置
答案 9 :(得分:0)
g ++ -lboost_system -lboost_filesystem userentry.cpp -o userentry
在debian下工作完美。 (增强了apt-get安装的c ++库)。
答案 10 :(得分:0)
如果未安装该库,则应给boost library文件夹:
示例:
g ++ -L / usr / lib / x86_64-linux-gnu -lboost_system -lboost_filesystem prog.cpp -o prog
答案 11 :(得分: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})