本片文章主要介绍的是如何在 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
-
#!/bin/bash
-
machine=`uname -m | grep '64'`
-
if [ a"$machine" == "a" ] ; then
-
bitlevel=32
-
else
-
bitlevel=64
-
fi
-
cd boost_1_58_0
-
./bootstrap.sh --prefix=/usr/local/boost
-
./bjam link=static threading=multi variant=release \
-
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 库中的方法
-
#include <stdio.h>
-
-
int main ( int argc , char ** argv )
-
{
-
printf ("hello world \n") ;
-
return 0 ;
-
}
2.2.1 执行 autoscan , 这个命令会根据当前路径下面的 .cpp .h .hpp 文件中引入的库函数或是库的头文件推导出
这一系列文件中,会使用到哪些库,根据用到的库会生成一个 configure.scan 文件 ,
这个文件时我们要进行修改的文件
2.2.2 修改 configure.scan 文件,将修改之后的文件重新命名为 configure.in
-
// configure.in
-
# -*- Autoconf -*-
-
# Process this file with autoconf to produce a configure script.
-
-
#modified by Aimer :
-
#this line means final executable file name , it can be considered as the project name
-
AC_INIT(Hello_World)
-
-
#add by Aimer :
-
#this line means in this project I will add third party libs
-
#such as bson , boost and so on
-
AC_USE_SYSTEM_EXTENSIONS
-
-
#add by Aimer : AM_INIT_AUTOMAKE(project name , version id)
-
AM_INIT_AUTOMAKE(Hello_World, 1.0)
-
-
#entry function file
-
AC_CONFIG_SRCDIR([Main.cpp])
-
AC_CONFIG_HEADERS([config.h])
-
-
# Checks for programs.
-
AC_PROG_CXX
-
# add by Aimer
-
AC_PROG_CC
-
-
#modified by Aimer: we want finally output Makefile
-
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 文件如下所示
-
AUTOMAKE_OPTIONS=foreign
-
-
bin_PROGRAMS=Hello_World
-
-
BSON_SRC_PATH=/unixC/Bson/bson/src
-
-
BOOST_LIB_PATH=/unixC/Boost/boost_1_58_0
-
-
-
#what source files Hello_World needs ?
-
-
Hello_World_SOURCES=\
-
-
Main.cpp \
-
-
$(BSON_SRC_PATH)/bsonobj.cpp $(BSON_SRC_PATH)/util/json.cpp \
-
-
$(BSON_SRC_PATH)/oid.cpp $(BSON_SRC_PATH)/lib/base64.cpp \
-
-
$(BSON_SRC_PATH)/lib/md5.cpp $(BSON_SRC_PATH)/lib/nonce.cpp
-
-
-
Hello_World_CXXFLAGS=\
-
-
-I$(BOOST_LIB_PATH) -I$(BSON_SRC_PATH) -D_FILE_OFFSET_BITS=64 \
-
-
-ggdb -Wall -O0
-
-
-
Hello_World_LDADD=\
-
-
-lpthread -lm -lboost_system -lboost_thread \
-
-
-lboost_thread -lboost_program_options -lrt
-
-
-
-
Hello_World_LDFLAGS=\
-
-
-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 文件,文件内容如下
-
#!/bin/sh
-
-
autoscan #scan all sub-program , justify which libraries program will need
-
#configure.scan
-
cp configure.scan configure.in
-
aclocal
-
autoconf
-
autoheader
-
automake --add-missing
-
./configure CXXFLAGS= CFLAGS=
-
make
可以按照如下的步骤一点点的来测试 bson 库
1. 仅仅在 Main.cpp 文件中添加一个头文件 "#include " , 然后执行 ./build.sh 脚本 ------> 发现一些正常
2. 在 Main.cpp 文件中添加 "using namespace bson ;" 命名空间的引用 , 然后执行 ./build.sh 脚本 --------> 发现一些正常
3. 在 Main.cpp 文件中的 入口函数 main 中创建对象
-
#include <cstdio>
-
#include <bson.h>
-
#include <util/json.h>
-
#include <util/time_support.h>
-
#include <lib/nonce.h>
-
-
using namespace bson ;
-
-
int main ( int argc ,char **argv )
-
{
-
BufBuilder bson(1) ;
-
bson.appendStr("hello Aimer") ;
-
-
std::cout<< bson.len() << std::endl;
-
-
printf ("hello Aimer \n") ;
-
return 0;
-
}
修改之后,调用脚本文件对该源文件进行重写的编译、链接.. ./build.sh
然后再次执行文件 ./Hello_World
输出如下内容
12
hello Aimer
这边说明一切运行都正确了,这里仅仅做过测试实验,没有涉及过多的细节 ,具体 bson 中的使用方法可参看后续博客。
end
阅读(6776) | 评论(1) | 转发(0) |