Linux中安装boost库详解

Linux中安装boost库详解

原创 2009年06月23日 23:16:00

     boost作为一个准标准库,在C++大型项目中经常要用到。在Linux中安装和配置boost库并不难,下面以我在Ubuntu8.04(内核2.6.24-24)下安装boost的经验为例,介绍boost的安装和配置。
    (1)下载最新的 boost库,下载地址: http://www.boost.org
    (2)解压 boost。若下载的是.tar.gz包,用tar xzvf boost_1_38_0.tar.gz来解压。若下载的是.tar.bz2包,用tar --bzip2 -xf /boost_1_38_0.tar.bz2解压。
    (3)安装 boost注意事项。boost 库文件有两种类型,一种是无需编译的库文件(Header-Only Libraries),我们可以直接使用它们来写C++程序,只要保证gcc能找到这些库文件的头文件。一种是需要单独编译的库文件(Separately-Compiled Libraries),这些库文件只有源文件我们还不能用来写C++程序,必须把它们编译成二进制文件并安装到系统中才能用。这是因为这些库依赖于操作的某些功能实现,如线程、文件系统、信号等(可见这些库在不同的操作系统上有不同的实现,只是向程序员提供了一致的接口)。编写C++程序若要使用这些单独编译的库,在编译程序时还要指定其二进制文件(.so文件)的位置,这样gcc才能加载这些二进制文件,并生成我们的程序。具有哪些库需要单独编译,可参考boost自带的文档,在“Getting Started”部分中。
    (4)若你不需要使用单独编译的库,那配置就比较简单。把解压的boost_1_38_0复制到/usr/local/include下(只是建议,也可以是其他目录,但必须保证gcc能找到它),然后如下操作:
$ cd /usr/local/include
$ sudo ln -s boost_1_38_0/boost boost
这样就新建了一个boost符号链接指向库文件所在目录(boost_1_38_0/boost下包含了所有的库文件),我们写C++程序时只需要用#include "boost/shared_ptr.hpp"的格式来使用相应的库。
    关键:实际上只需要在一个gcc能找到的path下新建一个boost符号链接指向你的boost_1_38_0/boost目录即可。
注:
1.gcc 在编译时如何去寻找所需要的头文件 :
※所以header file的搜寻会从-I开始
※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
※再找内定目录
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include
但是如果装gcc的时候给定了prefix的话,那么就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

2.gcc如何找库文件(如.so的二进制文件)
cos()等函式库的选项要多加 -lm
编译的时候:
※gcc会去找-L
※再找gcc的环境变量LIBRARY_PATH
※再找内定目录 /lib,/usr/lib,/usr/local/lib。这是当初compile gcc时写在程序内的

    (5)安装需要单独编译的boost库。若你需要使用单独编译的库,可以配置编译全部库,也可以指定要编译的库。首先cd到解压的boost_1_38_0。
配置编译全部库:

zhouhuansheng@laptop-zhou:~/zhou/backup/boost_1_38_0$ sudo ./configure --with-libraries=all
你也可以指定要编译的库:
zhouhuansheng@laptop-zhou:~/zhou/backup/boost_1_38_0$ sudo ./configure --with-libraries=program_options,regex
    可以选的库有:date_time, filesystem    - function_types    - graph    - iostreams    - mpi    -program_options    - python    - regex    - serialization    - signals    - system    - test    - thread    - wave等,库与库之间用,号分隔,不要有空格。
    然后用make命令编译,sudo make install命令安装。注意编译某些库可能会提示找不到一些文件(如Python库,如果你没有安装Python相关文件的话),如果不需要使用这个库,那没关系,不管它了。如果空间充足的话,我建议你编译所有的库,这样以后用起来就方便了。编译时间会比较长,请耐心等待。
    编译并安装完后,所有的二进制动态库会放在/usr/local/lib下,头文件会放在/usr/local/include的boost-1_38目录下,在usr/local/include下新建一个boost符号链接指向boost-1_38/boost目录。这就大功告成了。
    (6)测试。
不需要使用单独编译的库(exam11.cpp):
#include
#include
#include "boost/scoped_ptr.hpp"
int main()
{
  boost::scoped_ptr
           p(new std::string("Use scoped_ptr often."));
  if(p)
    std::cout<<*p<<'/n';
  std::size_t i=p->size();
  *p="Acts just like a pointer";
  std::cout<<*p< }  
编译和运行:
zhouhuansheng@laptop-zhou:~/zhou/boost$ g++ exam11.cpp -o exam11
zhouhuansheng@laptop-zhou:~/zhou/boost$ ./exam11
Use scoped_ptr often.
Acts just like a pointer
zhouhuansheng@laptop-zhou:~/zhou/boost$

需要使用单独编译的库(exam51.cpp):
#include
#include
#include
#include "boost/regex.hpp"
int main(){
    boost::regex reg("//d{3}([a-zA-Z]+).(//d{2}|N/A)//s//1");

    std::string correct="123Hello N/A Hello";
    std::string incorrect="123Hello 12 hello";
    assert(boost::regex_match(correct,reg)==true);
    assert(boost::regex_match(incorrect,reg)==false);
    return 0;
}
编译和运行(所需要动态库的名字在/usr/local/lib下可以找到,前缀字符lib和后缀名.so可以省略):
zhouhuansheng@laptop-zhou:~/zhou/boost$ g++ exam51.cpp -o exam51 -l boost_regex-gcc42-mt
zhouhuansheng@laptop-zhou:~/zhou/boost$ ./exam51
zhouhuansheng@laptop-zhou:~/zhou/boost$
    (7)可能的问题。若编译没有通过,则可能是gcc没有配置好,配置好gcc后再试试,注意编译时用g++命令来编译。还有一种我遇到过的情况:编译通过了,但运行提示找不到库(刚开始时你十之八九会遇到这种问题),这是因为程序运行时找不到/usr/local/lib下的动态库(Linux动态库的默认搜索路径是/lib和/usr/lib)。但在编译boost库时一般会把/usr/local/lib目录加到/etc/ld.so.conf配置文件中(实际上会把参数/usr/local/lib放到/etc/ld.so.conf.d/libc.conf中,然后用include指令加到/etc/ld.so.conf中),这个文件用来配置动态库搜索目录。可能是加入后没有更新,用ldconfig命令更新一下试试看。若还不行,则可以自己在/etc/ld.so.conf配置文件中添加/usr/local/lib,然后用ldconfig命令更新即可。
    总结:
    区分三个概念:
头文件搜索目录:gcc编译源程序时用来寻找源程序中引入的头文件,一般默认包括/usr/include,/usr/local/include
编译时动态库搜索目录:gcc编译源程序时用来寻找源程序需要的动态库,一般默认包括/lib,/usr/lib,/usr/local/lib
运行时动态库搜索目录:在linux中运行程序时用来寻找需要的动态库,一般默认包括/lib,/usr/lib

你可能感兴趣的:(Linux中安装boost库详解)