104

I am trying to include Boost libraries in my project and have been facing issues in the same. I am on Ubuntu 12.10 with Codeblocks IDE and tried installing the libraries manually reading instructions from the site, but was getting error's with header as well as to-be-built-before-use libraries.

I then installed the libraries via terminalby sudo apt-get install libboost-all-dev. After this, in my programs on Codeblocks, I can include headers like #include <boost/regex.hpp> but when I try to include the header for the Filesystem library ( #include "boost/filesystem/operations.hpp" ), I am getting the following error:

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

I am not sure how to resolve this error (specifically in Codeblocks on Linux). I really could use some help here.

Compiler : Gcc
Program code: Only tried inlcuding the above file system operations.hpp file.

Build log from 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
5
  • your not linking it right, codeblocks won't do it for you unlike you system path and system repository,
    – pyCthon
    Commented Nov 20, 2012 at 5:28
  • @pyCthon: In that case, can you add more detail more detail about how to link this in Code::blocks. I tried adding the linker flag -lboost_system at some place in settings, but it didn't resolve. However, I am not even sure if I did the whole linker flag thing at the right place. A little more detail would be of great help.
    – Cipher
    Commented Nov 20, 2012 at 5:33
  • well what compiler are you using? mingw? gcc? what code are you trying to run? give an example.....
    – pyCthon
    Commented Nov 20, 2012 at 5:47
  • @pyCthon: Comiler is Gcc. I have not written any code till now, but have tried including the Boost filesystem library (operation.hpp in the above post)
    – Cipher
    Commented Nov 20, 2012 at 5:52
  • does it work compiling a regular program with boost filesystem library from command line with g++?
    – pyCthon
    Commented Nov 20, 2012 at 15:26

13 Answers 13

156

You should link in the libboost_system library. I am not sure about codeblocks, but the g++ command-line option on your platform would be

-lboost_system

11
  • I already found the linker flag to be added though. Can't get it working in Codeblocks.
    – Cipher
    Commented Nov 20, 2012 at 9:36
  • @Cipher can you obtain the build and link commands executed by codeblocks? Commented Nov 20, 2012 at 12:12
  • @Cipher sorry, pastebin is blocked at work. I can check later but it will take a few hours. Commented Nov 20, 2012 at 12:39
  • No problem. Updated in the post as well
    – Cipher
    Commented Nov 20, 2012 at 15:21
  • i have the same problem as Cipher's, just in my case i deal with boost/asio.hpp. I get these error s1.directupload.net/images/130608/koyvqpdp.jpg when trying to compiler. When i try to add -lboost_system it says "cannot find lboost_system". What;s the problem?
    – ddacot
    Commented Jun 8, 2013 at 12:39
22

Depending on the boost version libboost-system comes with the -mt suffix which should indicate the libraries multithreading capability.

So if -lboost_system cannot be found by the linker try -lboost_system-mt.

1
  • 1
    It works because for these boost versions the actual library file name had a -mt suffix.
    – tssch
    Commented Feb 21, 2019 at 9:22
11

This answer actually helped when using Boost and cmake.

Adding add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) for cmake file.

My CMakeLists.txt looks like this:

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()
9

It's a linker problem. Include the static library path into your project.

For Qt Creator open the project file .pro and add the following line:

LIBS += -L<path for boost libraries in the system> -lboost_system

In my case Ubuntu x86_64:

LIBS += -L/usr/lib/x86_64-linux-gnu -lboost_system

For Codeblocks, open up Settings->Compiler...->Linker settings tab and add:

boost_system

to the Link libraries text widget and press OK button.

8

I searched for a solution as well, and none of the answers I encountered solved the error, Until I found the answer of "ViRuSTriNiTy" to this thread: Undefined reference to 'boost::system::generic_category()'?

according to that answer, try to add these lines to your cmake file:

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

Same problem on building a simple boost example, solved after i changed the g++ compiler flag from -std=c++14 to -std=c++11.

And I noticed that it's a C++11 Example...

3
  • That solved my issue. It's quite easy to forget the flags used during compilation, specially when you use the default ones. Commented Oct 7, 2018 at 21:46
  • You just saved my life. I encountered this problem in a legacy C++11 codebase, the Boost linking error doesn't make any sense and I've wasted several hours on this problem. Your post finally made me realize that the "undefined reference" was caused by a C++ ABI conflict, as the operating system's Boost was built in C++17. Rebuilding a local version of Boost from source using ./b2 cxxflags=-std=c++11 and now it works like a charm! Commented Sep 8, 2023 at 5:54
  • On further inspection, --std=c++11 only cured the symptom, not the root cause. The actual problem occurred because the source tree was built using bundled Boost headers from an old version, but at link time, it was linked against a much newer Boost from the operating system creating ABI conflicts. This is clearly not guaranteed to work. Using --std=c++11 with a different Boost version may or may not work, if it does, it's still a coincidence. The real solution is to simply replace the bundled Boost to the new version, or to build the same old Boost from source and link against it. Commented Sep 8, 2023 at 6:44
3

I had the same problem and also use Linux Mint (as nuduoz) . I my case problem was solved after i added boost_system to GCC C++ Linker->Libraries.

1

You could come across another problem. After installing Boost on the Linux Mint I've had the same problem. Linking -lboost_system or -lboost_system-mt haven't worked because library have had name libboost_system.so.1.54.0.

So the solution is to create symbolic link to the original file. In my case

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 /usr/lib/libboost_system.so

For more information see this question.

1

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

worked perfectly under debian. (boost c++ libraries installed with apt-get).

1

Il the library is not installed you should give boost libraries folder:

example:

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

0

try

g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out 

/usr/lib/x86_64-linux-gnu/ is the location of the boost library

use find /usr/ -name '*boost*.so' to find the boost library location

0

In my project I prefer to use header-only libraries. So nothing above was helpful. What did really help is:

add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)
0

After testing the proposed solutions described above, I found only these few of lines would work.

I am using 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})

Not the answer you're looking for? Browse other questions tagged or ask your own question.