Author Topic: Configuring Boost with Code::Blocks  (Read 71909 times)

Offline aaronds

  • Single posting newcomer
  • *
  • Posts: 5
Configuring Boost with Code::Blocks
« on: August 24, 2011, 04:00:35 pm »
Hi,

I've never configured an external library with a C/C++ IDE before so this is all new to me. I'm looking to configure the Boost library with Code::Blocks (windows, MinGW) but I just can't get it working. I have built and installed the Boost library, I just need to configure it with my project. I have of course consulted the documentation but it appears to be some what out of date, as it uses Boost 1.42 (I'm using 1.47). The documentation talks about include and lib folders, neither of which are in my installation.

So far, I have set up a global variable in the IDE called "boost" that links to the base directory of the boost installation as the base field (under builtin fields) and links to the boost/ subdirectory as the include field. Within the build options for my project, under search directories, I have set the compiler directory to the boost subdirectory within the boost installation folder, while I have also set the linker directory to the stage folder.

However, I am aware that even if all that I have done so far is correct, I still need to add additional linker settings but I'm lost as to what to do here. From what I can make out in the documentation I need to link specific libraries (I'm trying to use the asio library within Boost), but I can't find anything relevent within my boost installation.

If anyone could tell me whether what I've done so far is correct or not and perhaps direct me on where I should go from here, I would be very appreciative.

Cheers

Offline Alpha

  • Developer
  • Lives here!
  • *****
  • Posts: 1513
Re: Configuring Boost with Code::Blocks
« Reply #1 on: August 24, 2011, 07:00:35 pm »
It sounds like you have done most everything correctly so far, but just in case, I will list out several steps.

Create the global variable boost with extract_dir as the base.  (This is C:\Libraries\boost_1_47_0 on my computer.)  The other fields do not need anything (except possibly lib; if you used a custom directory while building boost, put the path here).
Next (assuming you are starting a project, not adding to an existing one), create a new project (a console app should be fine; see this page if you need step-by-step instructions on that).
In this project, open Project->Build options... and ensure that the overall name of the project is selected in the left-hand column (for example, boost_test).  Switch to the Search directories tab and click Add (for the Compiler tab).  In the box, type $(#boost) and click OK.
Many features of boost do not require any libraries, (asio included).  Here is a list of what does require linking.
(Edit:) Asio depends on Boost.System and may need Boost.Regex and OpenSSL depending on what you are doing.
To test the current configuration, put this (from here) in the main cpp.
Code
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " " );
}
If it compiles you are in business.  Accessing assio can be done by inserting the following line.
Code
#include <boost/asio.hpp>
If in working you ever come up with an undefined reference error, it will usually indicate a library does need to be linked.  In this case, return to the main project's search directories settings, but this time on the Linker tab.  Add $(#boost)\lib (or $(#boost.lib) if you set up the lib variable); this should point to the directory with all the lib*.a files.
After this, go to the Linker settings tab and add (using the Add button of course) the needed library or libraries.  (For example, boost_filesystem for the Boost.Filesystem library - basically the name of the file minus the lib and the .a.)
« Last Edit: August 24, 2011, 08:11:21 pm by Alpha »

Offline aaronds

  • Single posting newcomer
  • *
  • Posts: 5
Re: Configuring Boost with Code::Blocks
« Reply #2 on: August 24, 2011, 10:07:37 pm »
Hi, thanks very much for your response!

However, I still haven't been able to get boost working.

If in working you ever come up with an undefined reference error, it will usually indicate a library does need to be linked.  In this case, return to the main project's search directories settings, but this time on the Linker tab.  Add $(#boost)\lib (or $(#boost.lib) if you set up the lib variable);

My boost installation doesn't have a lib folder (maybe I'm getting the wrong idea)? I've done everything you said and I'm currently getting the undefined reference errors you talked about. In order to check whether this was due to a linker error, I linked all the available libraries (from the stage folder) but the errors persist (they're coming from error_code.hpp). Really not sure why I haven't been able to resolve this :S

Thanks again
« Last Edit: August 24, 2011, 10:17:43 pm by aaronds »

Offline Alpha

  • Developer
  • Lives here!
  • *****
  • Posts: 1513
Re: Configuring Boost with Code::Blocks
« Reply #3 on: August 25, 2011, 12:20:10 am »
Did the minimal code sample I provided compile?
Also, go to Settings->Compiler and debugger...->Build options (tab) and check Save build log and Always output the full command line.  If you post the log here (it should be generated in the project's directory each time you compile), I might be able to see what is going wrong.

I have built and installed the Boost library, I just need to configure it with my project.
My boost installation doesn't have a lib folder
I assume from this the build succeded, so there should be multiple lib*.a files somewhere on your harddrive - the default folder is lib, however, it seems they have gone somewhere else on your computer.  Locate this folder and add it to the linker search directories.

Offline aaronds

  • Single posting newcomer
  • *
  • Posts: 5
Re: Configuring Boost with Code::Blocks
« Reply #4 on: August 25, 2011, 01:03:40 am »
Did the minimal code sample I provided compile?
The code example appears to compile, but it doesn't output anything to the CMD window (it just seems to hang...?).

I assume from this the build succeded, so there should be multiple lib*.a files somewhere on your harddrive - the default folder is lib, however, it seems they have gone somewhere else on your computer.  Locate this folder and add it to the linker search directories.
I have a range of .lib files but not .a. When I built boost I didn't receive any errors and as far as I know the build was successful. However, I don't have a /lib/ folder, only /libs/ and /stage/lib/. I believe the output of the build was to /boost/bin.v2/libs (all directories created during the build). I didn't see anything else created. Maybe this is where the problem is...?


Offline Alpha

  • Developer
  • Lives here!
  • *****
  • Posts: 1513
Re: Configuring Boost with Code::Blocks
« Reply #5 on: August 25, 2011, 03:05:56 am »
The code example appears to compile, but it doesn't output anything to the CMD window (it just seems to hang...?).
Oh, I should have mentioned all it does is multiply the input number by 3 (you need to type a number and press enter).

I assume from this the build succeded, so there should be multiple lib*.a files somewhere on your harddrive - the default folder is lib, however, it seems they have gone somewhere else on your computer.  Locate this folder and add it to the linker search directories.
I have a range of .lib files but not .a. When I built boost I didn't receive any errors and as far as I know the build was successful. However, I don't have a /lib/ folder, only /libs/ and /stage/lib/.
Sorry, I apparently was not thinking when I replied previously; /stage/lib/ is the default folder (not lib).

I think the overall problem is that the library ws2_32 needs to be added to the linker.  Your build configuration does sound slightly different than mine, so if adding this library (as well as keeping the other necessary libraries) does not fix the problem, use the following steps to rebuild boost from scratch.

Download either the zip or the 7zip package from this page.  Extract the contents to extract_dir.

Open Command Prompt (cmd.exe) and navigate to extract_dir.
cd extract_dir

If the minGW\bin folder is not in the path variable add it.
path minGW_dir\bin;%path%

Build the boost build system by entering
bootstrap mingw

Open the file extract_dir\project-config.jam in Notepad and change the word msvc to gcc.

Back in the Command Prompt window, run
b2

If it still does not work, post a build log.
go to Settings->Compiler and debugger...->Build options (tab) and check Save build log and Always output the full command line.
« Last Edit: August 25, 2011, 03:58:01 pm by Alpha »

Offline aaronds

  • Single posting newcomer
  • *
  • Posts: 5
Re: Configuring Boost with Code::Blocks
« Reply #6 on: August 25, 2011, 05:44:59 pm »
Hi, I've just rebuilt boost and it looks a bit more promising. I hadn't configured the build to compile with MinGW previously (it had still built though). I'll edit once I try to build a project.

The code example appears to compile, but it doesn't output anything to the CMD window (it just seems to hang...?).
Oh, I should have mentioned all it does is multiply the input number by 3 (you need to type a number and press enter).
My bad, I only scan-read the code quickly before running it.

Edit:

Seem much closer than before. One last error to get rid of when attempting to use asio.
Code
undefined reference to `WSACleanup@8
undefined reference to `WSACleanup@0
Both errors originate from winsock_init.ipp. I've tried linking a few libraries (this time I have the .a files, one of the libs I tried linking was system) but I haven't resolved the issue.

If in working you ever come up with an undefined reference error, it will usually indicate a library does need to be linked.  In this case, return to the main project's search directories settings, but this time on the Linker tab.  Add $(#boost)\lib (or $(#boost.lib) if you set up the lib variable); this should point to the directory with all the lib*.a files.
After this, go to the Linker settings tab and add (using the Add button of course) the needed library or libraries.  (For example, boost_filesystem for the Boost.Filesystem library - basically the name of the file minus the lib and the .a.)
I don't have any .a file that has asio in the name.

If it still does not work, post a build log.
go to Settings->Compiler and debugger...->Build options (tab) and check Save build log and Always output the full command line.
I don't seem to have a build options tab :S

Thanks again for your help.
« Last Edit: August 25, 2011, 08:32:46 pm by aaronds »

Offline Alpha

  • Developer
  • Lives here!
  • *****
  • Posts: 1513
Re: Configuring Boost with Code::Blocks
« Reply #7 on: August 25, 2011, 11:26:40 pm »
One last error to get rid of when attempting to use asio.
Code
undefined reference to `WSACleanup@8
undefined reference to `WSACleanup@0
Both errors originate from winsock_init.ipp. I've tried linking a few libraries (this time I have the .a files, one of the libs I tried linking was system) but I haven't resolved the issue.
I think the overall problem is that the library ws2_32 needs to be added to the linker.
As you seem to have found, asio (on Windows) requires the Windows Sockets API; support for it can be added by linking to the library ws2_32 (it is included in minGW, so you do not need to find it).

I don't have any .a file that has asio in the name.
That is because asio does not have a library, it just requires the Boost.System library (and the Winsock library).

I don't seem to have a build options tab :S
See if this screenshot helps.  (The arrows scroll the tabs left and right, so the Build options tab may not be visible at first.)
« Last Edit: September 01, 2011, 11:10:37 pm by Alpha »

Offline aaronds

  • Single posting newcomer
  • *
  • Posts: 5
Re: Configuring Boost with Code::Blocks
« Reply #8 on: August 28, 2011, 04:49:47 pm »
Hi Alpha, sorry I was away for a few days. Thanks very much for your help, I got boost configured and working fine!
Thanks again

Offline Alpha

  • Developer
  • Lives here!
  • *****
  • Posts: 1513
Re: Configuring Boost with Code::Blocks
« Reply #9 on: August 28, 2011, 11:11:12 pm »
Glad to be of assistance (and that it worked).  If you feel comfortable enough with it, you might consider updating the boost page on the Code::Blocks wiki.  (If not, I probably will when I get around to it.)

Offline ptolomey

  • Multiple posting newcomer
  • *
  • Posts: 12
Re: Configuring Boost with Code::Blocks
« Reply #10 on: October 18, 2011, 07:04:43 pm »
I have problems with Code::Blocks configuration for Boost.

Description of problem:
 
1. During compilation of code supplied by Alpha, following error messages are appear  (have no compilation problems if not using Boost)
        a) C:\Program Files\CodeBlocks\Boost\include\boost-1_47\boost\lambda\detail\lambda_functor_base.hpp|227|  [ skipping 6 instantiation contexts ]|

        b) C:\Program Files\CodeBlocks\Boost\include\boost-1_47\boost\lambda\detail\operator_lambda_func_base.hpp:60|56|instantiated from 'boost::lambda::detail::binary_rt<boost::lambda::bitwise_action<boost::lambda::leftshift_action>, boost::tuples::tuple<std::basic_ostream<char>&, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::multiply_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, const int, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::nu|
   
        c) C:\Program Files\CodeBlocks\Boost\include\boost-1_47\boost\lambda\detail\lambda_functors.hpp:202|50|instantiated from 'typename inherited::sig<boost::tuples::tuple<const A&> >::type boost::lambda::lambda_functor<Base>::operator()(const A&) const [with A = int, T = boost::lambda::lambda_functor_base<boost::lambda::bitwise_action<boost::lambda::leftshift_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::bitwise_action<boost::lambda::leftshift_action>, boost::tuples::tuple<std::basic_ostream<char>&, boost::lambda::lambda_functor<boost::lambda::lamb|

        d) c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.5.2\include\c++\bits\stl_algo.h:4185|2|instantiated from '_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = std::istream_iterator<int>, _Funct = boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::bitwise_action<boost::lambda::leftshift_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::bitwise_action<boost::lambda::leftshift_action>, boost::tuples::tuple<std::basic_ostream<char>&, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boo|

2) Used software versions
      a. Code::Blocks 10.05
      b. MinGW 4.6
      c. Boost 1.47.0

3) Boost libraries were built after several manipulations described below
      a. In file \boost_1_47_0\bootstrap.bat line set toolset=msvc was replaced with line set toolset=gcc
      b. In file \boost_1_47_0\tools\build\v2\engine\build.bat under the procedure :Guess_toolset updates the MinGW entry to point to the correct folder:
         
 
Code
          call :Clear_Error
          if EXIST "C:\Program Files\CodeBlocks\MinGW\bin\gcc.exe" (
          set "BOOST_JAM_TOOLSET=mingw"
          set "BOOST_JAM_TOOLSET_ROOT=C:\Program Files\CodeBlocks\MinGW\"
          goto :eof)
         
 
      c. In file \boost_1_47_0\tools\build\v2\engine\build.bat, removed all other blocks of code similar to the above codeblock from the procedure :Guess_toolset
      d. Compiled and Built the Boost C++ Library binaries
           i. In CMD (command line) enter the command: c:\boost_1_47_0\bootstrap.bat, it successfully built the executable Bjam.exe
          ii. To build the Boost Library binaries entered command in CMD:
                 
Code
bjam --toolset=gcc --build-type=complete "--prefix=C:\Program Files\CodeBlocks\Boost" install

  following Boost directories hierarchy was created:
         
        c:\Program Files\CodeBlocks\boost\
                                                        lib   (contain built libraries, only files with extension *.a)
                                                        include\boost-1_47\boost\...  (header files and e.t.c)

4. Setting Code::Blocks Global Variables         
     a. In Global Variable Editor defined new Variables
             i. In Current Set clicked on New button and entered variable name boost
            ii. In Current Variable clicked on New button and entered variable name boost
           iii. In filed base entered following path: C:\Program Files\CodeBlocks\Boost\include\boost-1_47
           iv. In field lib entered following path: C:\Program Files\CodeBlocks\Boost\lib

5. Setting Code::Blocks Project Build Options
     a. In Project->Build options...
            i. Ensured that the overall name of the project is selected in the left-hand column
           ii. In Search directories tab Compiler sub-tab filed entered $(#boost)
          iii. In Search directories tab Linker sub-tab filed entered $(#boost.lib)

Offline Alpha

  • Developer
  • Lives here!
  • *****
  • Posts: 1513
Re: Configuring Boost with Code::Blocks
« Reply #11 on: October 19, 2011, 01:08:46 am »
        d) c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.5.2\include\c++\bits\stl_algo.h:4185|2|instantiated from '_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = std::istream_iterator<int>, _Funct = boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::bitwise_action<boost::lambda::leftshift_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::bitwise_action<boost::lambda::leftshift_action>, boost::tuples::tuple<std::basic_ostream<char>&, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boo|
2) Used software versions
      a. Code::Blocks 10.05
      b. MinGW 4.6
      c. Boost 1.47.0
It looks like you may have two conflicting MinGW installations.
(I just tested the code with 4.6; it compiled with zero warnings or errors).

Note: error messages are more readable when enclosed in code tags.

Offline ptolomey

  • Multiple posting newcomer
  • *
  • Posts: 12
Re: Configuring Boost with Code::Blocks
« Reply #12 on: October 19, 2011, 11:45:29 am »
Alpha thanks for advise,
I have installed Qt SDK (4.7), it comes with MinGW 4.5, built inside package.
I will uninstall it and try to compile above mentioned code one more time
Code
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " " );
}

In any case thanks for advise.
I will response if succeeded or not.

Offline ptolomey

  • Multiple posting newcomer
  • *
  • Posts: 12
Re: Configuring Boost with Code::Blocks
« Reply #13 on: February 11, 2012, 02:42:17 pm »
Finally I succeeded.
The only mistake was in definition of CodeBlocks Search Directories of Compiler.
It has to be: $(#boost.include) and NOT $(#boost) as written in Wiki http://wiki.codeblocks.org/index.php?title=BoostWindowsQuickRef

Offline Master

  • Multiple posting newcomer
  • *
  • Posts: 53
Re: Configuring Boost with Code::Blocks
« Reply #14 on: April 04, 2012, 06:25:05 pm »
hello all , i have the same problem getting boost to work with CB .
i can compile this source code :
Code
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " " );
}

i used these command to compile boost :
boost is extracted to F:\
and main folder address is :
Code
F:\boost_1_49_0
here are the commands :
Code
F:\
F:\ cd Boost_1_44_0
F:\ Boost_1_44_0> bootstrap.bat
F:\ Boost_1_44_0>bjam toolset=gcc --build-type=complete stage
-------------------
the above didnt do any good so i wrote this and actually compiled just fine :
Code
F:\ Boost_1_44_0>bjam variant=debug,release link=static address-model=32 
and then
Code
F:\boost_1_49_0>bjam toolset=gcc variant=debug,release link=static threading=multi address-model=32 --build-type=complete stage
then when i tried to compile a thread example :
Code
#include <boost/thread.hpp>
#include <iostream>

void wait(int seconds)
{
  boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}

boost::mutex mutex;

void thread()
{
  for (int i = 0; i < 5; ++i)
  {
    wait(1);
    mutex.lock();
    std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl;
    mutex.unlock();
  }
}

int main()
{
  boost::thread t1(thread);
  boost::thread t2(thread);
  t1.join();
  t2.join();
}

which failed miserably with these errors :
Code
obj\Debug\main.o||In function `Z6threadv':|
D:\Documents and Settings\Master\My Documents\Projects\Boost Example\main.cpp|18|undefined reference to `_imp___ZN5boost11this_thread6get_idEv'|
obj\Debug\main.o||In function `main':|
D:\Documents and Settings\Master\My Documents\Projects\Boost Example\main.cpp|27|undefined reference to `_imp___ZN5boost6thread4joinEv'|
D:\Documents and Settings\Master\My Documents\Projects\Boost Example\main.cpp|28|undefined reference to `_imp___ZN5boost6thread4joinEv'|
D:\Documents and Settings\Master\My Documents\Projects\Boost Example\main.cpp|28|undefined reference to `_imp___ZN5boost6threadD1Ev'|
D:\Documents and Settings\Master\My Documents\Projects\Boost Example\main.cpp|28|undefined reference to `_imp___ZN5boost6threadD1Ev'|
D:\Documents and Settings\Master\My Documents\Projects\Boost Example\main.cpp|28|undefined reference to `_imp___ZN5boost6threadD1Ev'|
D:\Documents and Settings\Master\My Documents\Projects\Boost Example\main.cpp|28|undefined reference to `_imp___ZN5boost6threadD1Ev'|
F:\boost_1_49_0\boost\thread\win32\thread_data.hpp|161|undefined reference to `_imp___ZN5boost11this_thread18interruptible_waitEPvNS_6detail7timeoutE'|
obj\Debug\main.o||In function `thread<void (*)()>':|
F:\boost_1_49_0\boost\thread\detail\thread.hpp|205|undefined reference to `_imp___ZN5boost6thread12start_threadEv'|
||=== Build finished: 9 errors, 0 warnings (0 minutes, 49 seconds) ===|




i configured CB like this :
right clicked on the active project >build options >Debug>Search Directories >Compiler:
added these:
Code
$(#boost.include)
F:\boost_1_49_0
F:\boost_1_49_0\boost
F:\boost_1_49_0\stage\lib
and under linker i added:
Code
$(#boost.lib)
F:\boost_1_49_0\stage\lib
F:\boost_1_49_0\libs
then i added to the Linker section and selected all of the files in stage/libs : these are :
here is the pic :

and for the variable part :
i have this :

--------------------------
what is it that i am missing ?
a man's dream is an index to his greatness...