Linux下及ARM下编译boost 1.58.0

一、Linux下编译安装boost

最近在在Linux下配置Qt环境,同时项目需要用到Boost库,网上关于Linux下编译Boost库和Linux系统的Qt Creator中使用Boost库这二者的教程很多,但是没有一篇贯穿全部的教程,有鉴于此,如下是全部步骤:
1、下载Boost库,版本自选,建议最新版本
地址:http://www.boost.org/

2、Linux下编译Boost库,解压下载好的Boost库;

打开终端,cd 到Boost库解压目录,如我的为:/home/holy/boost_1_58_0

执行命令  sudo ./bootstrap.sh;(这里生成Boost专用编译工具)或

                sudo ./bootstrap.sh –with-libraries=all –with-toolset=gcc 

--with-libraries指定编译哪些boost库,all的话就是全部编译,只想编译部分库的话就把库的名称写上,之间用 , 号分隔即可,可指定的库有以下几种:
库名 说明
atomic  
chrono  
context  
coroutine  
date_time  
exception  
filesystem  
graph 图组件和算法
graph_parallel  
iostreams  
locale  
log  
math  
mpi 用模板实现的元编程框架
program_options  
python 把C++类和函数映射到Python之中
random  
regex 正则表达式库
serialization  
signals  
system  
test  
thread 可移植的C++多线程库
timer  
wave  

--with-toolset指定编译时使用哪种编译器,Linux下使用gcc即可,如果系统中安装了多个版本的gcc,在这里可以指定gcc的版本,比如--with-toolset=gcc-4.4。
执行完成后会在boost根目录生成 b2.exe 、bjam.exe 、project-config.jam 、bootstrap.log四个文件。其中b2.exe 、bjam.exe 这两个exe作用是一样的,bjam.exe 是老版本,b2是bjam的升级版本

执行命令 sudo ./b2 install

bjam命令参数分析

我们以文章【1】中的命令来分析一下各个参数的作用

(1)stage/install:

stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录,所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。

(2)toolset:

指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。

(3)without/with:

选择不编译/编译哪些库。因为python、mpi等库我都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页http://www.python.org/下载安装。

查看boost包含库的命令是./b2 --show-libraries

(4)stagedir/prefix:

stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,如VS2008对应的是E:\SDK\boost\bin\vc9,VC6对应的是E:\SDK\boost\bin\vc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6类似(光这路径都这样累赘,还是使用stage好)。

(5)build-dir:

编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:\SDK\boost)下,目录名为bin.v2,等编译完成后可将这个目录全部删除(没用了),所以不需要去设置。

(6)link:

生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用static方式。一般boost库可能都是以static方式编译,因为最终发布程序带着boost的dll感觉会比较累赘。

(7)runtime-link:

动态/静态链接C/C++运行时库。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式,各人可以根据自己的需要选择编译。

(8)threading:

单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。

(9)debug/release:

编译debug/release版本。一般都是程序的debug版本对应库的debug版本,所以两个都编译。


等待安装完成,会在/usr/local/include目录下生成Boost库头文件(其实是拷贝,因为在解压后的Boost文件中就有Boost的头文件),在/usr/local/lib下编译生成Boost库文件,这里是默认编译生成路径,为了以后使用方便,可以在Boost库的解压目录/home/you neme/boost_1_58_0中新建一个stage文件,在stage里面再新建一个lib文件(我在Windows系统下由于习惯是这么干的),然后将生成的库文件拷贝到/home/you neme/boost_1_58_0/stage/lib下;


3、Qt Creator中使用Boost库(这里以thread库的使用为例)
新建控制台应用主程序中代码如下:

#include <QtCore/QCoreApplication>

#include <boost/thread.hpp>

#include <iostream>


using namespace std;void hello()

{    cout<<"qt"<<endl;

}


int main(int argc, char *argv[])

{    

    QCoreApplication a(argc, argv);    

    boost::thread My_thread(&hello);    

    My_thread.join();    

    return a.exec();

}


.pro文件中添加Boost头文件路径和库文件路径,如下:

LIBS +=/home/XXX/boost_1_52_0/stage/lib/libboost_thread.a
LIBS +=/home/XXX/boost_1_52_0/stage/lib/libboost_system.a


注意这里,在Qt中使用Boost库一定要加:(具体原因看:http://blog.csdn.net/mangobar/article/details/52044778)

DEFINES +=BOOST_USE_LIB


即可编译运行


二、Linux-arm下编译boost 1.58.0

下载boost 1.58.0,解压缩


运行booststrap.sh,运行后,生产project-config.jam和bjam

修改project-config.jam文件,如下

# Boost.Build Configuration
# Automatically generated by bootstrap.sh

import option ;
import feature ;

# Compiler configuration. This definition will be used unless
# you already have defined some toolsets in your user-config.jam
# file.
if ! gcc in [ feature.values <toolset> ]
{
    using gcc : : /home/xxxxxx/arm/3.4.1/bin/arm-linux-gcc ;
}

project : default-build <toolset>gcc ;

# Python configuration
using python : 2.7 : /usr ;

# List of --with-<library> and --without-<library>
# options. If left empty, all libraries will be built.
# Options specified on the command line completely
# override this variable.
libraries =  ;

# These settings are equivivalent to corresponding command-line
# options.
option.set prefix : /home/xxxxxx/arm/3.4.1 ;
option.set exec-prefix : /home/xxxxxx/arm/3.4.1/bin ;
option.set libdir : /home/xxxxxx/arm/3.4.1/lib ;
option.set includedir : /home/xxxxxx/arm/3.4.1/include ;
 /home/xxxxxx/arm/3.4.1是arm-linux-gcc编译器所在的位置,红色部分是需要修改的

最后运行bjam,生产boost for arm-linux库

猜你喜欢

转载自blog.csdn.net/qing666888/article/details/79371985