Protocol Buffers 是googol提供的,一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
项目中对通讯协议部分的数据处理时,使用protobuf对socket的字节流进行序列化和反序列化。由于项目中的protobuf是静态库的形式使用,所以第一反应就是下载官方的源文件,安装readme指示进行操作,然而只能生产proto文件编译器(个人叫法),却编译不出来我需要的静态库。
按照网上提供方式的处理,自己建立库工程,提取protobuf源文件,删除test相关的文件,然后进行编译。此方式太容易出错了,多次尝试后,终于不了了之。在进行了两天的苦苦寻觅后,终于让我找到一个国外的大叔做的一个(一键式)编译脚本。https://gist.github.com/BennettSmith/9487468ae3375d0db0cc/download#
不如意事十八九,能与人言无二三。在我柳暗花明之后,以为终于要一路平坦到达胜利的时候,再一次让我心如刀绞,肝肠寸断。编译不过啊,下载不了啊,各种问题啊。
首先是提示系统缺少一些编译必须的工具,Autoconf, Automake & Libtool。不用什么说的,安装吧。
然后又是下载不了的问题。这里我结合脚本说一下:(大部分地方注释的很清楚,没有更多需要说的)
#!/bin/bashecho "$(tput setaf 2)"echo "###################################################################"echo "# Preparing to build Google Protobuf"echo "###################################################################"echo "$(tput sgr0)"# The results will be stored relative to the location# where you stored this script, **not** relative to# the location of the protobuf git repo.PREFIX= `pwd`/protobufif [ -d ${PREFIX} ]thenrm -rf "${PREFIX}"fimkdir -p "${PREFIX}/platform"# A "YES" value will build the latest code from GitHub on the master branch.# A "NO" value will use the 2.6.0 tarball downloaded from googlecode.com.#这个变量确定是从github获取源码,还是从googol官网获取USE_GIT_MASTER=NOPROTOBUF_GIT_URL=https://github.com/google/protobuf.gitPROTOBUF_GIT_DIRNAME=protobufPROTOBUF_VERSION=2.6.0PROTOBUF_RELEASE_URL=https://protobuf.googlecode.com/svn/rc/protobuf- ${PROTOBUF_VERSION}.tar.gzPROTOBUF_RELEASE_DIRNAME=protobuf- ${PROTOBUF_VERSION}#以下这几个变量决定了,打包库中包含哪些架构的库BUILD_MACOSX_X86_64=YESBUILD_I386_IOSSIM=YESBUILD_X86_64_IOSSIM=YESBUILD_IOS_ARMV7=YESBUILD_IOS_ARMV7S=YESBUILD_IOS_ARM64=YESPROTOBUF_SRC_DIR=/tmp/protobufDARWIN=darwin13.4.0XCODEDIR= `xcode-select --print-path`IOS_SDK_VERSION=`xcrun --sdk iphoneos --show-sdk-version`MIN_SDK_VERSION=7.1MACOSX_PLATFORM=${XCODEDIR}/Platforms/MacOSX.platformMACOSX_SYSROOT=${MACOSX_PLATFORM}/Developer/MacOSX10.9.sdkIPHONEOS_PLATFORM=`xcrun --sdk iphoneos --show-sdk-platform-path`IPHONEOS_SYSROOT=`xcrun --sdk iphoneos --show-sdk-path`IPHONESIMULATOR_PLATFORM=`xcrun --sdk iphonesimulator --show-sdk-platform-path`IPHONESIMULATOR_SYSROOT=`xcrun --sdk iphonesimulator --show-sdk-path`# Uncomment if you want to see more information about each invocation# of clang as the builds proceed.# CLANG_VERBOSE="--verbose"CC=clangCXX=clangCFLAGS="${CLANG_VERBOSE} -DNDEBUG -g -O0 -pipe -fPIC -fcxx-exceptions"CXXFLAGS="${CLANG_VERBOSE} ${CFLAGS} -std=c++11 -stdlib=libc++"LDFLAGS="-stdlib=libc++"LIBS="-lc++ -lc++abi"echo "PREFIX ..................... ${PREFIX}"echo "USE_GIT_MASTER ............. ${USE_GIT_MASTER}"echo "PROTOBUF_GIT_URL ........... ${PROTOBUF_GIT_URL}"echo "PROTOBUF_GIT_DIRNAME ....... ${PROTOBUF_GIT_DIRNAME}"echo "PROTOBUF_VERSION ........... ${PROTOBUF_VERSION}"echo "PROTOBUF_RELEASE_URL ....... ${PROTOBUF_RELEASE_URL}"echo "PROTOBUF_RELEASE_DIRNAME ... ${PROTOBUF_RELEASE_DIRNAME}"echo "BUILD_MACOSX_X86_64 ........ ${BUILD_MACOSX_X86_64}"echo "BUILD_I386_IOSSIM .......... ${BUILD_I386_IOSSIM}"echo "BUILD_X86_64_IOSSIM ........