由于C++的特殊性,我们建议您先用本文介绍的方法编译,复制build/release/src/tablestore/core/impl/buildinfo.cpp备用。然后将C++ SDK源码以及buildinfo.cpp复制到您自己的代码库中,并用您的编译系统来进行编译。

编译参数

在编译客户端代码的时候,有些编译器的行为是必须保证的,即,某些编译器参数是必须的。

以下是针对gcc编译器的编译参数及说明。

参数 是否必须 说明
--std=gnu++03 必须 支持C++98 TR1语言版本,带gcc扩展(即typeof)。
-pthread 必须 多线程编程的必要参数。编译或者链接都需要加上该参数。
-fwrapv 必须 整型数据溢出则回转,即,无符号整型向上溢出则成为0,有符号整型向上溢出则成为最小的负数。客户端基于这个行为做溢出检查。
-O2 建议存在 优化级别。一般不建议更高的优化级别。
-fsanitize=address和-fvar-tracking-assignments 建议存在 gcc-4.9之后支持libasan,可以快速而轻量地检测各种内存使用上的错误。如果需要表格存储的开发人员定位错误,请带上这两个编译参数复现错误,并且在链接的时候也需要带上前一个参数。
注意 libasan和valgrind不兼容。

环境依赖与预编译包

本文以debian8系统为例说明生成预编译包的方法。

  1. 打开docker/debian8/Dockerfile文件,选择dockerfile的方式输出客户端对系统的环境依赖。这种方式可以自动保证代码和环境的一致性。
    RUN apt-get install -y scons g++ libboost-all-dev protobuf-compiler libprotobuf-dev uuid-dev libssl-dev
    RUN apt-get install -y ca-certificates # for HTTPS support
    

    SDK依赖以下几项:

    • scons & gcc: 编译系统
    • boost
    • uuid
    • protobuf:序列化库
    • openssl:签名,以及支持HTTPS所用
    • ca-certificates:仅为支持HTTPS所用。如果您只用表格存储的HTTP地址,可以不安装这个库。建议使用更为安全的HTTPS。
  2. 安装以上包之后便可以编译客户端。方法是下载客户端的源码,并在源码目录下执行scons
    $ git clone https://github.com/aliyun/aliyun-tablestore-cpp-sdk.git
    $ cd aliyun-tablestore-cpp-sdk
    $ scons -j4
    

当上述步骤正常结束,一个tar包就编译好了。包名通常可以在scons最后的输出中找到。例如debian8系统,包名及所在的路径是:build/release/pkg/aliyun-tablestore-cpp98-sdk-4.4.1-debian8.9-x86_64.tar.gz

  • 包名里包含以下几个要素:

    • C++版本(C++98)
    • SDK版本(4.4.1)
    • OS版本(debian8.9)
    • OS架构(x86_64)
  • 包的内容包括:

    $ tar -tf build/release/pkg/aliyun-tablestore-cpp98-sdk-4.4.1-debian8.9-x86_64.tar.gz
    version.ini
    lib/libtablestore_core.so
    lib/libtablestore_core_static.a
    lib/libtablestore_util.so
    lib/libtablestore_util_static.a
    include/tablestore/util/arithmetic.hpp
    include/tablestore/util/assert.hpp
    include/tablestore/util/foreach.hpp
    include/tablestore/util/iterator.hpp
    include/tablestore/util/logger.hpp
    include/tablestore/util/logging.hpp
    include/tablestore/util/mempiece.hpp
    include/tablestore/util/mempool.hpp
    include/tablestore/util/metaprogramming.hpp
    include/tablestore/util/move.hpp
    include/tablestore/util/optional.hpp
    include/tablestore/util/prettyprint.hpp
    include/tablestore/util/random.hpp
    include/tablestore/util/result.hpp
    include/tablestore/util/security.hpp
    include/tablestore/util/seq_gen.hpp
    include/tablestore/util/threading.hpp
    include/tablestore/util/timestamp.hpp
    include/tablestore/util/try.hpp
    include/tablestore/util/assert.ipp
    include/tablestore/util/iterator.ipp
    include/tablestore/util/logging.ipp
    include/tablestore/util/mempiece.ipp
    include/tablestore/util/move.ipp
    include/tablestore/util/prettyprint.ipp
    include/tablestore/core/client.hpp
    include/tablestore/core/error.hpp
    include/tablestore/core/range_iterator.hpp
    include/tablestore/core/retry.hpp
    include/tablestore/core/types.hpp
    

    即,包内容包含以下元素:

    • 版本文件:version.ini
    • 库文件:lib/下所有文件。其中libtablestore_core_static.a依赖libtablestore_util_static.a,动态库也类似。
    • 头文件:include/下所有文件。