Chinaunix首页 | 论坛 | 博客
  • 博客访问: 579741
  • 博文数量: 104
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1559
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-21 00:58
个人简介

锻炼精神,首先要锻炼肉体

文章分类

全部博文(104)

文章存档

2018年(1)

2016年(1)

2015年(101)

2014年(1)

我的朋友

分类: C/C++

2015-04-25 15:33:03

本片文章主要介绍的是如何在 linux 环境下面安装并使用 bson

bson 的正确安装和使用必须要有如下几个前提条件作为支撑:

1. boost 在系统中正确的安装与配置
2. autotools 在系统正常工作

前两个条件满足之后,便可以使用 bson 了 
3. 编写程序调用 bson 库函数


1. boost的安装与配置

1.1 首先到官网下载最新的 boost 的安装包,在这里不推荐使用 apt,yum install 等方式安装
      因为我们需要boost 的静态链接库,*.a 这样的库文件,使用自动安装的话,无法控制
      安装的路径和生成的库的格式。
      [命令] wget 

 1.2 将安装包在指定的路径下面进行解压
      [命令] tar -xzf boost_1_58_0.tar.gz

 1.3 编写自动安装编译脚本
      在解压之后生成的文件夹 boost_1_58_0 的上一层目录中创建文件
      [命令] touch boost_install.sh 

点击(此处)折叠或打开

  1. #!/bin/bash
  2. machine=`uname -m | grep '64'`
  3. if [ a"$machine" == "a" ] ; then
  4. bitlevel=32
  5. else
  6. bitlevel=64
  7. fi
  8. cd boost_1_58_0
  9. ./bootstrap.sh --prefix=/usr/local/boost
  10. ./bjam link=static threading=multi variant=release \
  11. address-model=$bitlevel toolset=gcc runtime-link=static
   
 修改 boost_install.sh 的权限,
   [命令] chmod 755 boost_install.sh 
  
 运行安装脚本
  [命令] ./boost_install.sh
   等待编译结束之后,就会在 boost_1_58_0/stage/ 文件夹的下面找到刚才编译生成的静态库文件 *.a 
   静态库文件是我们编译使用 bson 库所需要的,所以 boost 安装编译执行到这个程度即可,
  如果你想编写程序以动态链接的方式调用 boost 库的话,
   不推荐这种静态编译的方法。毕竟此方法是为 bson 的安装与编译做铺垫的,仅仅是 boost 源码安装中的一种方法,其他方式安装具体看官网的介绍
 
 2. 使用 autotools 来静态编译 bson 库
   2.1 首先先来介绍一下 autotools
        autotools 是为了统一定制生成 Makefile 而开发的由一系列工具组成的一套自动编译工具,
        其中包括 autoscan , aclocal , autoconf , autheader , automake 在这里不介绍其运行的原理,仅仅介绍一下使用方法

   2.2 autotools 的使用方法
         2.2.1 首先编写测试文件 Main.cpp 就是简单的 hello world 的程序,这个并不是重点,
                   重点是后续步骤中如何编译 bson 库文件,也就是待到所有的流程都执行正确之后,
                 我们在向 hello world 中引入 bson 库并且调用 bson 库中的方法   

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main ( int argc , char ** argv )
  3. {
  4.   printf ("hello world \n") ;
  5.   return 0 ;
  6. }
         2.2.1 执行 autoscan , 这个命令会根据当前路径下面的 .cpp .h .hpp 文件中引入的库函数或是库的头文件推导出
                这一系列文件中,会使用到哪些库,根据用到的库会生成一个 configure.scan 文件 ,
               这个文件时我们要进行修改的文件

        2.2.2 修改 configure.scan 文件,将修改之后的文件重新命名为 configure.in 
                 

点击(此处)折叠或打开

  1. // configure.in
  2. # -*- Autoconf -*-
  3. # Process this file with autoconf to produce a configure script.

  4. #modified by Aimer :
  5. #this line means final executable file name , it can be considered as the project name
  6. AC_INIT(Hello_World)
  7. #add by Aimer :
  8. #this line means in this project I will add third party libs
  9. #such as bson , boost and so on
  10. AC_USE_SYSTEM_EXTENSIONS

  11. #add by Aimer : AM_INIT_AUTOMAKE(project name , version id)
  12. AM_INIT_AUTOMAKE(Hello_World, 1.0)

  13. #entry function file
  14. AC_CONFIG_SRCDIR([Main.cpp])
  15. AC_CONFIG_HEADERS([config.h])
  16. # Checks for programs.
  17. AC_PROG_CXX
  18. # add by Aimer
  19. AC_PROG_CC

  20. #modified by Aimer: we want finally output Makefile 
  21. AC_OUTPUT(Makefile)
     2.2.3 执行命令 aclocal
            执行该命令以后会生成 autom4te.cache ,不过这个东西一般情况下都不看的
    2.2.4 继续执行命令 autoconf
             执行该命令以后会生成 configure 这个可执行文件
    2.2.5 继续执行命令 autoheader
             执行该命令之后会生成 configure.h.in 
   2.2.6 创建文件 Makefile.am 这个是用来静态编译 bson 库的重要编译文件,
          autotools 中的 automake 会根据 Makefile.am 中的文法格式来根据编译环境定制的生成 Makefile 文件
            Makefile.am 文件如下所示
            

点击(此处)折叠或打开

  1. AUTOMAKE_OPTIONS=foreign
  2. bin_PROGRAMS=Hello_World
  3. BSON_SRC_PATH=/unixC/Bson/bson/src
  4. BOOST_LIB_PATH=/unixC/Boost/boost_1_58_0
  5. #what source files Hello_World needs ?
  6. Hello_World_SOURCES=\
  7. Main.cpp \
  8. $(BSON_SRC_PATH)/bsonobj.cpp $(BSON_SRC_PATH)/util/json.cpp \
  9. $(BSON_SRC_PATH)/oid.cpp $(BSON_SRC_PATH)/lib/base64.cpp \
  10. $(BSON_SRC_PATH)/lib/md5.cpp $(BSON_SRC_PATH)/lib/nonce.cpp

  11. Hello_World_CXXFLAGS=\
  12. -I$(BOOST_LIB_PATH) -I$(BSON_SRC_PATH) -D_FILE_OFFSET_BITS=64 \
  13. -ggdb -Wall -O0

  14. Hello_World_LDADD=\
  15. -lpthread -lm -lboost_system -lboost_thread \
  16. -lboost_thread -lboost_program_options -lrt
  17. Hello_World_LDFLAGS=\
  18. -fPIC -rdynamic -L$(BOOST_LIB_PATH)/stage/lib -pthread

   2.2.7 继续执行命令 automake --add-missing
            执行命令结束之后,生成文件  depcomp ,Makefile.in  等等, 最重要的是 Makefile.in ,有它便说明一切顺利

  2.2.8 继续执行命令           
              ./configure CXXFLAGS= CFLAGS=
          执行命令结束之后,基于 Makefile.in 生成文件 Makefile ------> 这个便是我们最终想要的

  2.2.9 继续执行命令
             make 
          执行命令结束之后,生成可执行文件 Hello_World 

  2.2.10 运行可执行文件 Hello_World 
             ./Hello_World 
          执行命令输出 "hello world"

到这里,所有的流程均正确,下面为了方面调用,我们来写一个 build.sh j脚本,同时向 Main.cpp 文件中
先引入 bson 库的头文件,然后添加 bson 中的对象,调用对象自带的方法。
3. 使用 bson 库中的函数
   创建 build.sh 文件,文件内容如下
  

点击(此处)折叠或打开

  1. #!/bin/sh
  2. autoscan #scan all sub-program , justify which libraries program will need
  3. #configure.scan
  4. cp configure.scan configure.in
  5. aclocal
  6. autoconf
  7. autoheader
  8. automake --add-missing
  9. ./configure CXXFLAGS= CFLAGS=
  10. make
   可以按照如下的步骤一点点的来测试 bson 库
  1. 仅仅在 Main.cpp 文件中添加一个头文件 "#include " , 然后执行 ./build.sh 脚本 ------> 发现一些正常
  2. 在 Main.cpp 文件中添加 "using namespace bson ;" 命名空间的引用 , 然后执行 ./build.sh 脚本 --------> 发现一些正常
  3. 在 Main.cpp 文件中的 入口函数 main 中创建对象
      

点击(此处)折叠或打开

  1. #include <cstdio>
  2. #include <bson.h>
  3. #include <util/json.h>
  4. #include <util/time_support.h>
  5. #include <lib/nonce.h>

  6. using namespace bson ;

  7. int main ( int argc ,char **argv )
  8. {
  9.   BufBuilder bson(1) ;
  10.   bson.appendStr("hello Aimer") ;
  11.   
  12.   std::cout<< bson.len() << std::endl;

  13.   printf ("hello Aimer \n") ;
  14.   return 0;
  15. }
  修改之后,调用脚本文件对该源文件进行重写的编译、链接.. ./build.sh
 然后再次执行文件 ./Hello_World 
 输出如下内容
 12 
 hello Aimer

 这边说明一切运行都正确了,这里仅仅做过测试实验,没有涉及过多的细节 ,具体 bson 中的使用方法可参看后续博客。

  end

阅读(6776) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

夏目玲子2015-04-25 17:00:53

github :https://github.com/aimer1027/test_field/tree/master/bson_lib_test