Welcome. This a guide on how to install the Boost libraries from source. Although the boost libraries are available in the universe repository there are people who have tried to install from source for one reason or another (myself included) and, because of the unfamiliar method by which Boost choose to create their libraries, fall into trouble or else never really understand what to do (even though it's not all that hard actually).
This is only a very simple guide on how to get the source compiled and installed and I wont go into more advanced topics on how to customize the installation (because I don't know myself) or on how to cross-compile (since I've tried and given up on that -- the problem being that the boost build system doesn't use the correct cross-compiling binaries for compiling and creating the libraries and it's next to Alchemy trying to understand how to get the thing to use the correct ones. As a last resort, not even creating symlinks from the the cross-compiling binary to the corresponding normal build binary didn't work!).
-1) General Information
This guide is specifically written for boost libraries version 1.39.0. The general idea of what we're doing will probably still apply for some of the more recent older library version; but, there will be crucial differences, like the fact that the file configure will exist instead of bootstrap.sh.
You will need the necessary compiling tools (g++, ld, etc...); so, first, install them:
sudo aptitude install build-essential g++
You will need the source code! Boost's website is not the best when it comes to finding where things are, so just navigate to their getting started page and under the section Get Boost follow the link to the download page and download tar.bz2 file (the tar.7z file has Windows line-terminators, so reading those files in Linux will cause errors). Incidentally, that getting started page is the general reference from which I've derived this guide (along with a bit of trial and much error).
1) Compile the library
Go to where you downloaded the directory and uncompress it:
Note that the uncompressed source is over 250Mb; so if space is an issue, make the necessary sacrifices!
tar xjf boost_1_39_0.tar.bz2
Then change directory into the boost directory:
Next, we'll need to build the bjam binary and perhaps also set some options on what to compile and where to. Read the next three sub-sections carefully and read it all before you do anything!
Firstly, you will not want to compile the whole boost library since that means compiling a lot of libraries that you don't want or wont use. So, to see a list of the libraries that need compiling, run:
Pick which ones you want and remember them: I'll be choosing filesystem, program_options and system. Note that picking system is needed since it contains the error class that filesystem uses, and I bet that, since the majority of you readers will be looking to compile the filesystem library, this means cutting a few problems out later on for a lot of you!
What you'll need to run is the command:
But don't do that just yet: keep reading!
If you do want to compile the whole damned thing, then you don't need to bother with the command above: you'll just run bootstrap.sh as it is:
Again, don't run anything yet: still keep on reading!
Next, you'll need to consider where you want the library installed to. By default, the header files are installed to /usr/local/include, and the libraries themselves are installed to /usr/local/lib. These locations will be more than adequate (it's not recommended to install stuff to /usr/include, /usr/include/lib or /lib); but, if you do want/need to specify a different location, you'll need to run bootstrap.sh like this:
which will install the libraries to /my/lib/dir and the header files to /my/include/dir.
./bootstrap --libdir=/my/lib/dir --includedir=/my/include/dir
Note: there is a bug in that the libraries are installed to /lib and not /usr/local/lib by default; so I'd recommend explicitly telling the build process to install to /usr/local/lib. Do this by adding the flag: --exec-prefix=/usr/local.
Still, don't run anything yet! Keep reading!
OK, now bring the info from the last two sub-sections together: you'll want the command:
For example, I want to only install the filesystem, program_options, and system libraries, and just to the default lib and include directories; so, I'll personally run:
./bootstrap.sh --exec-prefix=/usr/local --with-libraries=desired_list_of_libs --libdir=/my/lib/dir --includedir=/my/include/dir
Having done this (or something similar depending on what you want to do) you'll see the message:
./bootstrap.sh --with-libraries=filesystem,program_options,system --exec-prefix=/usr/local
At this point, you can then do the compiling proper...
Run the command:
And that's it!
Immediately after compiling, and before we install them, the header files will be in the directory boost, and the libraries in the directory stage/lib. To install them, just run:
Note that, on my system, that command seems to hang for a while; so, give it a chance before killing it.
sudo ./bjam install
Now, there is one "bug" in the installation process. The installation procedure does not create a symlink called libboost_filesystem.so. It's not really a problem, but it's very useful if it does exist. Look in your library directory to see if it's there, or else create it:
And change /usr/local/lib if you changed where you installed your libraries to at stage 1.2.3, and amend libboost_filesystem-gcc43-mt.so if it's different on your system. (Post a comment if you are having trouble with this since the names will probably be different from system-to-system and don't do anything if you're not at all sure on how libraries are named and symlinked).
sudo ln -s /usr/local/lib/libboost_filesystem-gcc43-mt.so /usr/local/lib/libboost_filesystem.so
3) Using the libraries
This bit normally causes a few problems, so read it carefully!
Include your header files as usual in your code like:
and then tell your compiler where the include libraries are with a -I flag:
If you changed your include directory at stage 1.2.3 by issuing:
g++ -I/usr/local/include/boost-1_39 ...
then you'll need to amend the g++ command to:
Then, we'll also need to make sure we can link to the libraries.
If you did not change the directory to where the libraries are installed to from the default at stage 1.2.3, then simply run:
And you can start linking the library as usual:
If you did change the lib directory at stage 1.2.3 by running:
g++ -lboost_filesystem ...
then you'll need to run the linking stage as:
Hopefully, that's it! You should now be able to use boost!
g++ -L/my/lib/dir -lboost_filesystem
Problems and Updates
Leave a comment if you have a problem and I'll try to help. But, please, nothing on cross-compiling since I'll go bald trying to figure that one out! Suggestions and experiences on trying to get it to work, however, are welcome.
Also, improvements and updates to the guide are more than welcome.