Linux中安装boost库详解

来源:互联网 发布:mac照片怎么删除 编辑:程序博客网 时间:2024/05/16 14:42


Linux中安装boost库详解  

2012-05-24 14:31:08|  分类:linux |  标签:|举报|字号 订阅

来自:http://apps.hi.baidu.com/share/detail/58570207

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

0 0