Ubuntu下编译安装boost库,Linux上安装使用boost入门

ubuntu下boost编译安装

boost

安装

环境:Ubuntu 12.04 32bit,boost 1.49

 

1.依赖安装

  1. apt-get install mpi-default-dev libicu-dev python-dev python3-dev libbz2-dev zlib1g-dev 


前期准备:boost中,用到了别的函数库,所以为了使用boost中相应的功能,需要先安装系统中可能缺失的库 

Linux上安装使用boost入门指导

2.访问boost官网下载boost最新版本

apt-get install mpi-default-dev  #安装mpi库

获得boost

3.解压下载文件,例如下载文件在~/Downloads下

  1. cd ~/Downloads 


  2. tar --bzip2 -xvf boost_1_58_0.tar.bz2 


apt-get install libicu-dev     #支持正则表达式的UNICODE字符集 

boost分布

4.准备安装

  1. cd boost_1_58 


  2. ./bootstrap.sh 


生成文件b2和bjam计算md5sum发现二者一致
生成bjam,上述命令可以带有各种选项,具体可参考帮助文档: ./bootstrap.sh --help。其中–prefix参数,可以指定安装路径,如果不带–prefix参数的话(推荐),默认路径是 /usr/local/include 和 /usr/local/lib,分别存放头文件和各种库。执行完成后,会生成bjam,已经存在的脚本将会被自动备份。注意,boost 1.49会在当前目录下,生成两个文件bjam和b2,这两个是一样的,

apt-get install python-dev     #需要python的话

只需要头文件的库

5.编译并安装boost

编译完成后,进行安装,也就是将头文件和生成的库,放到指定的路径(–prefix)下

  1. ./b2  //编译boost 


  2. sudo ./b2 install //将生成的库安装到/usr/local/lib目录下面,默认的头文件在/usr/local/include/boost目录下边。 


apt-get install libbz2-dev     #如果编译出现错误:bzlib.h: No such file or directory

使用boost建立一个简单的程序

6.卸载

将/usr/local/lib和/usr/local/include/boost两个目录下的文件直接删除就可以。

上述函数库装好之后,就可以编译boost库了。解压boost_1_49_0.tar.bz2,得到/boost_1_49_0,将当前工作目录切换到此文件夹下。

准备使用boost二进制文件库

7.测试安装是否正确

新建cpp文件

  1. vim boot.cpp 


  2. #include <string> 


  3. #include <iostream> 


  4. #include <boost/version.hpp> 


  5. #include <boost/timer.hpp> 


  6. using namespace std; 


  7. int main() 



  8. boost::timer t; 


  9. cout << "max timespan: " << t.elapsed_max() / 3600 << "h" << endl; 


  10. cout << "min timespan: " << t.elapsed_min() << "s" << endl; 


  11. cout << "now time elapsed: " << t.elapsed() << "s" << endl; 


  12. cout << "boost version" << BOOST_VERSION <<endl; 


  13. cout << "boost lib version" << BOOST_LIB_VERSION <<endl; 


  14. return 0; 



编译

  1. g boot.cpp -o boot 


  2. ./boot 


成功编译之后会显示结果,最后两行打印boost版本

  1. max timespan: 2.56205e 09h 


  2. min timespan: 1e-06s 


  3. now time elapsed: 0.000121s 


  4. boost version106300 


  5. boost lib version1_63 


./bootstrap.sh

把你的程序链接到boost库

生成bjam,上述命令可以带有各种选项,具体可参考帮助文档: ./bootstrap.sh --help。其中--prefix参数,可以指定安装路径,如果不带--prefix参数的话(推荐),默认路径是 /usr/local/include 和 /usr/local/lib,分别存放头文件和各种库。执行完成后,会生成bjam,已经存在的脚本将会被自动备份。注意,boost 1.49会在当前目录下,生成两个文件bjam和b2,这两个是一样的,所以接下来的步骤,可以用这两个中的任意一个来执行。

1.获得boost

using mpi ;  #如果需要MPI功能,需要在 /tools/build/v2/user-config.jam 文件的末尾添加

下载boost_1_46_1.tar.bz2

接下来就是利用生成的bjam脚本编译源代码了

解压

./b2 -a -sHAVE_ICU=1  #-a参数,代表重新编译,-sHAVE_ICU=1代表支持Unicode/ICU

2.boost分布

注意,这里是全部编译。当然也可以选择只编译一部分,选项 --with-<library> 只编译指定的库,如输入--with-regex就只编译regex库了。boost1.49 的完全编译,在笔者Intel® Core™2 Duo CPU T5750 @ 2.00GHz × 2 ,2G DDR2内存的老机子上,使用上述选项,半个小时就差不多了。这个时间是可以承受的。全部编译安装,心理上感觉也舒服些。^_^

boost_1_46_1.........................boost根目录

bjam的一些常用的参数,列表如下:

  boost/.....................................所有boost头文件

--build-dir=<builddir> 编译的临时文件会放在builddir里(这样比较好管理,编译完就可以把它删除了)
--stagedir=<stagedir> 存放编译后库文件的路径,默认是stage
--build-type=complete

编译所有版本,不然只会编译一小部分版本,确切地说是相当于:

variant=release, threading=multi;link=shared|static;runtime-link=shared

variant=debug|release 决定编译什么版本(Debug or Release?)
link=static|shared 决定使用静态库还是动态库
threading=single|multi 决定使用单线程还是多线程库
runtime-link=static|shared 决定是静态还是动态链接C/C 标准库
--with-<library> 只编译指定的库,如输入--with-regex就只编译regex库了
--show-libraries 显示需要编译的库名称

  libs/........................................Tests,.cpps,docs等的库文件

编译完成后,进行安装,也就是将头文件和生成的库,放到指定的路径(--prefix)下

注意:

./b2 install

  (1)boost根目录(通常是/usr/local/boost_1_46_1)想到$BOOST_ROOT变量中

至此,如果一切顺利,就完成安装了。写个小程序检验下,来自《Boost程序库完全开发指南——深入C “准”标准库(修订版)》(罗剑锋著,电子工业出版社2012.5)

  (2)编译程序时如果用到boost库,需要指定头文件路径-I$BOOST_ROOT

Boost程序库完全开发指南——深入C “准”标准库高清PDF版下载: 

  (3)因为所有头文件都在boost文件夹下,并且头文件都是hpp后缀,所#include形如:

#include "stdcpp.hpp"

    #include <boost/whaever.hpp>

#include <boost/timer.hpp>

3.只需要头文件的库

 

  绝大多数的boost库都是header-noly的:它们完全由包含模板和inline函数的头文件组成,不需要单独编译和二进制库文件,也不需要链接时特别对待。

using namespace boost;

  只有下面的boost库必需单独built:

 

Boost.Filesystem

int main()

Boost.GraphParallel

{

Boost.IOStreams

    timer t;

Boost.MPI

    cout << "max timespan: " << t.elapsed_max() / 3600 << "h" << endl;

Boost.ProgramOptions

    cout << "min timespan: " << t.elapsed_min() << "s" << endl;

Boost.Python (see the Boost.Python build documentation before building and installing it)

 

Boost.Regex

    cout << "now time elapsed: " << t.elapsed() << "s" << endl;

Boost.Serialization

 

Boost.Signals

    return EXIT_SUCCESS;

Boost.System

}

Boost.Thread

程序输出:

Boost.Wave

max timespan: 0.596523h

  下面这些单独built是可选(optional)的: 

min timespan: 1e-06s

  Boost.DateTime  Boost.Graph  Boost.Math  Boost.Random  Boost.Test

now time elapsed: 0s

4.使用boost建立简单的程序

Ubuntu编译安装boost并在eclipse C/C 中使用

  下面的程序(example.cc)只用到header-only库。它是从标准输入中读入一串整数,使用Boost.Lambda每个数乘以3后输出。

-----------------------------------分割线-----------------------------------

view sourceprint?

我也在ubuntu下装了boost,不过遇到了一些问题:
www.bkjia.com @www.bkjia.com:~/Code$ g -lboost_filesystem -lboost_system main.cpp
/tmp/cclYtfBf.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text 0x49): undefined reference to `boost::system::generic_category()'
main.cpp:(.text 0x53): undefined reference to `boost::system::generic_category()'
main.cpp:(.text 0x5d): undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status

#include <boost/lambda/lambda.hpp>

也就是说加了#include<boost/filesystem.hpp>这句之后马上出错,其他都没问题。不知到你有没有遇到这个问题呢?

#include <iostream>

答:

#include <iterator>

"boost/filesystem.hpp" 这个文件依赖于boost_system,编译的时候,需要 -lboost_system选项,但是你的编译选项里头已经指定该选项,为什么还会出现链接错误呢。我也纳闷了半天,后来发现,原来是-l选项的顺序问题。在g 的man帮助信息里面,我发现了下面的话:

#include <algorithm>

引用It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.

 

读完这段话,应该就明白出错原因了。所以,解决方案就是用下面的命令来编译:

int main()

引用g main.cpp -lboost_system -lboost_filesystem

{

12.04 32bit,boost 1.49 前期准备:boost中,用到了别的函数库,所以为了使用boost中相应的功能,需要先安装系统中可能缺失的库...

    using namespace boost::lambda;

    typedef std::istream_iterator<int> in;

 

    std::for_each(

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

}

编译:g   -I$BOOST_ROOT  example.cc  -o  example

运行:echo 1 2 3 | ./example

5.准备使用boost二进制库

  如果你的程序用到需要单独编译的boost库,你需要首先获得这些二进制库文件。

5.1编译安装所有二进制库文件

  cd $BOOST_ROOT

  ./bootstrap.sh  --help

  ./bootstrap.sh  --prefix=/usr/local    ##其实默认情况下prefix的值就是/usr/local

  此时生成了bjam可执行文件,这个东西就是用来编译boost库的。

  ./bjam  install

5.2仅安装指定的二进制库文件

  下面均使用系统默认的编译器,即Linux上的gcc。

  5.2.1安装Boost.build

  Boost.Build是一个用于开发、测试、安装软件的基于文本的系统。Boost.Build的生成安装步骤:

  (1)cd $BOOST_ROOT/tools/build/v2

  (2)./bootstrap.sh

  (3)./bjam  install  --prefix=/usr/local/      ##prefix是Boost.Build安装位置

  (4)把prefix/bin放到PATH中          ##当然/usr/local/bin已经PATH中了

  5.2.2调用bjam时不指定toolset则使用系统默认的编译器。如果你的Linux上装了不同版本的gcc,则使用toolset选项时可以指定版本号:toolset=gcc-4.4

  5.2.3指定build路径,通过--build-dir=/path选项,不指定时默认在当前路径下创建bin.v2文件夹,把生成的文件放在其内。

  5.2.4调用bjam

  cd  $BOOST_ROOT

  bjam  --build-dir=./build-boost  toolset=gcc   stage

  上面的命令将创建static and shared non-debug multi-threaded variants of the libraries.如果要建立所有的variants,请使用"--build-type=complete"选项。

  所有的boost二进制库文件将放在stage/lib/下,如果你要另外指定路径,请使用“--stagedir=directory"选项。

  注意为节省build时间,你可能需要少build一些库文件:

查看库文件名称  --show-libraries

限制build哪些库  --with-libraryname或者--without-libraryname

选择特定的build variant  adding release or debug to the command line

  友情提示:Boost.Build会生成很多报告输出,如果你能保证建立过程不出错误,你可以禁止这些输出以节省时间。方法:在命令后追加”>build.log  2>&1"

6.把你的程序链接到boost库

  下面的程序是从邮件中抽取“主题”内容,它用到了Boost.Regex库,这个库是需要单独编译的。

view sourceprint?

#include <boost/regex.hpp>

#include <iostream>

#include <string>

 

int main()

{

    std::string line;

    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

    

    while (std::cin)

    {

        std::getline(std::cin, line);

        boost::smatch matches;

        if (boost::regex_match(line, matches, pat))

            std::cout << matches[2] << std::endl;

    }

}

编译:

方法A:g   -I$BOOST_ROOT  example.cc -o example  $BOOST_ROOT/stage/lib/ -lboost_regex.a

方法B:g   -I$BOOST_ROOT  example.cc -o example  -L$BOOST_ROOT/stage/lib/ -lboost_regex

当你要使用多个库源于一个路径时使用方法B就省力了(paid off)。注意到方法B中并没有指定.a(静态库)还中.so(动态库),系统将自动地帮你选择使用静态库还是动态库,当然你可以通过选项“-static"显示地指定。

6.1库文件的命名方式

拿libboost_regex-gcc34-mt-d-1_36来说:

lib....................................通用前缀

boost_regex.....................库名

gcc34...............................编译时使用的toolset是gcc-3.4

mt...................................编译时是支持多线程的

d/s/g/y/p..........................ABI tag

1_36................................Tag version

6.2运行我们的程序

  首先新建一个文本文件mail.txt

view sourceprint?

To: George Shmidlap

From: Rita Marlowe

Subject: Will Success Spoil Rock Hunter?


See subject.

如果我们的程序链接到了一个共享动态库,我们需要让系统知道到哪儿去加载它。请看我的~/.bashrc文件:

view sourceprint?

#boost

export BOOST_ROOT="/usr/local/boost_1_46_1"

export LD_LIBRARY_PATH="/usr/local/boost_1_46_1/stage/lib:$LD_LIBRARY_PATH"

运行程序:./example  <  mail.txt

应该输出

view sourceprint?

Will Success Spoil Rock Hunter?

获得boost boost分布 只需要头文件的库 使用boost建立一个简单的程序 准备使用boost二进制文件库 把你的程序链接...

本文由星彩网app下载发布于计算机编程,转载请注明出处:Ubuntu下编译安装boost库,Linux上安装使用boost入门

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。