• probuff


    原来的网址:http://www.th7.cn/Program/IOS/201506/484001.shtml

    首先是怎么安装Protobuf。 来自https://github.com/alexeyxo/protobuf-objc的文档。

    打开终端!

    brew -v

    查看你的mac里面有没有装brew。brew是mac os里面,类似于ubuntu的apt-get的功能,都可以直接在终端输入命令然后安装程序。-v自然就是版本version的意思

    ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)

    这一句半懂不懂,大概就是利用curl工具访问那个url,然后在ruby环境下载安装brew
    建议先去Homebrew官网找最新的下载地址
    brew install automake
    brew install libtool
    brew install protobuf

    就是利用brew下载安装了。protobuf就是我们想要的,另外两个是依赖库

    git clone https://github.com/alexeyxo/protobuf-objc.git

    ./build.sh

    从github下载protobuf-objc这个工程,build脚本里面做的是编译。
    我建议不要用 ./build.sh ,我安装过程中发现未知错误最终没有进行下去。哎,好失败。懂脚本的朋友可以尝试下。

    到此,我们先得感谢 http://www.2cto.com/kf/201503/382440.html的文章作者。点开链接的朋友会发现,这都什么吗,明显照抄人家的。。。尴尬
    我只能说,该作者前半部分解释的非常好,我是超越不了了,只能完全借用了。其实说白了,就是懒。言归正传:
    当我们 git clone https://github.com/alexeyxo/protobuf-objc.git 完成后,

    cd ~/protobuf-objc
    ./autogen.sh
    ./configure

    ~/protobuf-objc其实就是刚刚clone的文件目录
    进行./configure 可能会报错,不过别着急,先分析错误信息
    configure: error: 
    ERROR: protobuf headers are required.
    You must either install protobuf from google,
    or if you have it installed in a custom location
    you must add '-Iincludedir' to CXXFLAGS
    and '-Llibdir' to LDFLAGS.
    If you did not specify a prefix when installing
    protobuf, try
      './configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib'
    In some 64-bit environments, try LDFLAGS=-L/usr/local/lib64.

    仔细看,不难发现终端给出了解决办法,我想这应该是跟系统是不是64位有关吧(个人猜测)。

    ./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib

    运行通过后,

    make
    make install

    最终生成的插件名字为protoc-gen-objc,会被安装到/usr/local/bin/目录下。
    你可以 

    cd /usr/local/bin/ 
    ls -a

    按照我的方法,肯定能看见protoc-gen-objc。

    一切准备就绪,我们来测试下。
    在桌面创建一个 ProtoBuf的文件夹。然后
    cd ~/Desktop/ProtoBuf
    touch person.proto
    vi person.proto

    就按ProtocolBuffer的语法规则简单建立一个.proto的文件

    package csdnblog;
    message PBUser {
    required string userId = 1;
    optional string nick = 2;
    optional string avatar = 3;
    }

    创建完毕后,我们来编译这个person.proto文件。cd到ProtoBuf的文件夹后,命令如下:

    protoc --plugin=/usr/local/bin/protoc-gen-objc person.proto --objc_out=./

    protoc会自动在/usr/local/bin/目录下寻找名为”protoc-gen-objc”的插件,并使用该插件编译.proto文件,最终生成两个文件:

    Person.pb.h
    Person.pb.m

    这个步骤通过后,说明ProtocoBuffer Compiler for Objective-C可以正常工作了。

    现在我们可以在Xcode中使用ProtocolBuffer

    打开Xcode!新建一个ProtoBuffer工程! 然后有两个方法把protobuf添加到你的工程里面,一个是直接添加,一个是利用CocoaPods 强烈推荐后者,因为cocoapods能够很方便管理第三方类库,以后人家的工程升级了,你只需要一行 pod update 就ok了。顺便打个广告:CocoaPods的强大,不用不知道,一用吓一跳惊讶

    关于安装和使用cocoapods,属于另一个话题,看另一个博文。
    我的cocoapods 版本是0.36  我的Podfile文件如下:

    source 'https://gitcafe.com/akuandev/Specs.git'

    # platform :ios, '7.0'

    target "ProtoBuffer" do

        pod "ProtocolBuffers", "~> 1.9.7"

    end

    在保存之后,到终端,cd到工程里面,
    pod install

    完成后,将前面编译的 Person.pb.h和Person.pb.m导入工程中,到此你就可以使用了。

    提示:~/protobuf-objc文件里有一个 iOS的栗子哦,有兴趣的朋友可以研究下哦。奋斗

    注:“source 'https://gitcafe.com/akuandev/Specs.git'”  我这个cocoapods使用了一个叫akinliu在gitcafe上建立的CocoaPods索引库的镜像。因为gitcafe是国内的服务器,所以会快很多。
    如下操作可以将CocoaPods设置成使用gitcafe镜像:

    pod repo remove master
    pod repo add master https://gitcafe.com/akuandev/Specs.git
    pod repo update

    Either you, or somebody else, appears to have edited the autogen.sh script to directly run/Library/Developer/CommandLineTools/usr/bin/libtool or made some other change to cause it to run that script; this was the Wrong Thing To Do, as that's the OS X libtool, and that is most definitelyNOT the libtool that Wireshark wants.

    what do I need to do to fix it?

    1. undo whatever was done to cause autogen.sh to make it run/Library/Developer/CommandLineTools/usr/bin/libtool;
    2. rename whatever version of libtool you installed (probably /usr/local/bin/libtool) toglibtool, and rename thelibtoolize in the same directory toglibtoolize, so that it looks just like the GNU libtool that OS X used to provide, and thus so that Wireshark's attempt to use the GNU libtool works.

    glibtool系统名称冲突,需要强制命名
    本文借鉴了以下两篇博文,非常感谢他们的分享。希望大家可以参考一下:
    http://www.2cto.com/kf/201503/382440.html
    http://www.cnblogs.com/tara/archive/2012/03/20/2407951.html


    chaowudeiMac:desktop chaowu$ git clone https://github.com/qzix/protobuf-objc.git
    Cloning into 'protobuf-objc'...
    remote: Counting objects: 951, done.
    remote: Total 951 (delta 0), reused 0 (delta 0), pack-reused 951
    Receiving objects: 100% (951/951), 848.88 KiB | 70.00 KiB/s, done.
    Resolving deltas: 100% (551/551), done.
    Checking connectivity... done.
    chaowudeiMac:desktop chaowu$ cd protobuf-objc
    chaowudeiMac:protobuf-objc chaowu$ ls
    CREDITS        README.md    configure.ac
    Makefile.am    autogen.sh    src
    chaowudeiMac:protobuf-objc chaowu$ ./autogen.sh
    libtoolize: putting auxiliary files in '.'.
    libtoolize: copying file './ltmain.sh'
    libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
    libtoolize: copying file 'm4/libtool.m4'
    libtoolize: copying file 'm4/ltoptions.m4'
    libtoolize: copying file 'm4/ltsugar.m4'
    libtoolize: copying file 'm4/ltversion.m4'
    libtoolize: copying file 'm4/lt~obsolete.m4'
    configure.ac:13: installing './compile'
    configure.ac:9: installing './config.guess'
    configure.ac:9: installing './config.sub'
    configure.ac:10: installing './install-sh'
    configure.ac:10: installing './missing'
    src/compiler/Makefile.am:6: warning: source file 'google/protobuf/objectivec-descriptor.pb.cc' is in a subdirectory,
    src/compiler/Makefile.am:6: but option 'subdir-objects' is disabled
    automake: warning: possible forward-incompatibility.
    automake: At least a source file is in a subdirectory, but the 'subdir-objects'
    automake: automake option hasn't been enabled.  For now, the corresponding output
    automake: object file(s) will be placed in the top-level directory.  However,
    automake: this behaviour will change in future Automake versions: they will
    automake: unconditionally cause object files to be placed in the same subdirectory
    automake: of the corresponding sources.
    automake: You are advised to start using 'subdir-objects' option throughout your
    automake: project, to avoid future incompatibilities.
    src/compiler/Makefile.am: installing './depcomp'
    chaowudeiMac:protobuf-objc chaowu$ ./depcomp
    ./depcomp: No command.  Try './depcomp --help' for more information.
    chaowudeiMac:protobuf-objc chaowu$ ./configure
    checking build system type... x86_64-apple-darwin14.1.0
    checking host system type... x86_64-apple-darwin14.1.0
    checking target system type... x86_64-apple-darwin14.1.0
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for a thread-safe mkdir -p... ./install-sh -c -d
    checking for gawk... no
    checking for mawk... no
    checking for nawk... no
    checking for awk... awk
    checking whether make sets $(MAKE)... yes
    checking whether make supports nested variables... yes
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables... 
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking whether gcc understands -c and -o together... yes
    checking for style of include used by make... GNU
    checking dependency style of gcc... gcc3
    checking for g++... g++
    checking whether we are using the GNU C++ compiler... yes
    checking whether g++ accepts -g... yes
    checking dependency style of g++... gcc3
    checking C++ compiler flags...... use default: -g -O2 -DNDEBUG
    checking how to print strings... printf
    checking for a sed that does not truncate output... /usr/bin/sed
    checking for grep that handles long lines and -e... /usr/bin/grep
    checking for egrep... /usr/bin/grep -E
    checking for fgrep... /usr/bin/grep -F
    checking for ld used by gcc... /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld
    checking if the linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) is GNU ld... no
    checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm
    checking the name lister (/usr/bin/nm) interface... BSD nm
    checking whether ln -s works... yes
    checking the maximum length of command line arguments... 196608
    checking how to convert x86_64-apple-darwin14.1.0 file names to x86_64-apple-darwin14.1.0 format... func_convert_file_noop
    checking how to convert x86_64-apple-darwin14.1.0 file names to toolchain format... func_convert_file_noop
    checking for /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld option to reload object files... -r
    checking for objdump... no
    checking how to recognize dependent libraries... pass_all
    checking for dlltool... no
    checking how to associate runtime and link libraries... printf %s/n
    checking for ar... ar
    checking for archiver @FILE support... no
    checking for strip... strip
    checking for ranlib... ranlib
    checking command to parse /usr/bin/nm output from gcc object... ok
    checking for sysroot... no
    checking for a working dd... /bin/dd
    checking how to truncate binary pipes... /bin/dd bs=4096 count=1
    checking for mt... no
    checking if : is a manifest tool... no
    checking for dsymutil... dsymutil
    checking for nmedit... nmedit
    checking for lipo... lipo
    checking for otool... otool
    checking for otool64... no
    checking for -single_module linker flag... yes
    checking for -exported_symbols_list linker flag... yes
    checking for -force_load linker flag... yes
    checking how to run the C preprocessor... gcc -E
    checking for ANSI C header files... yes
    checking for sys/types.h... yes
    checking for sys/stat.h... yes
    checking for stdlib.h... yes
    checking for string.h... yes
    checking for memory.h... yes
    checking for strings.h... yes
    checking for inttypes.h... yes
    checking for stdint.h... yes
    checking for unistd.h... yes
    checking for dlfcn.h... yes
    checking for objdir... .libs
    checking if gcc supports -fno-rtti -fno-exceptions... yes
    checking for gcc option to produce PIC... -fno-common -DPIC
    checking if gcc PIC flag -fno-common -DPIC works... yes
    checking if gcc static flag -static works... no
    checking if gcc supports -c -o file.o... yes
    checking if gcc supports -c -o file.o... (cached) yes
    checking whether the gcc linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) supports shared libraries... yes
    checking dynamic linker characteristics... darwin14.1.0 dyld
    checking how to hardcode library paths into programs... immediate
    checking whether stripping libraries is possible... yes
    checking if libtool supports shared libraries... yes
    checking whether to build shared libraries... yes
    checking whether to build static libraries... yes
    checking how to run the C++ preprocessor... g++ -E
    checking for ld used by g++... /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld
    checking if the linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) is GNU ld... no
    checking whether the g++ linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) supports shared libraries... yes
    checking for g++ option to produce PIC... -fno-common -DPIC
    checking if g++ PIC flag -fno-common -DPIC works... yes
    checking if g++ static flag -static works... no
    checking if g++ supports -c -o file.o... yes
    checking if g++ supports -c -o file.o... (cached) yes
    checking whether the g++ linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) supports shared libraries... yes
    checking dynamic linker characteristics... darwin14.1.0 dyld
    checking how to hardcode library paths into programs... immediate
    checking for ANSI C header files... (cached) yes
    checking fcntl.h usability... yes
    checking fcntl.h presence... yes
    checking for fcntl.h... yes
    checking for inttypes.h... (cached) yes
    checking limits.h usability... yes
    checking limits.h presence... yes
    checking for limits.h... yes
    checking for stdlib.h... (cached) yes
    checking for unistd.h... (cached) yes
    checking for working memcmp... yes
    checking for working strtod... yes
    checking for ftruncate... yes
    checking for memset... yes
    checking for mkdir... yes
    checking for strchr... yes
    checking for strerror... yes
    checking for strtol... yes
    checking google/protobuf/stubs/common.h usability... yes
    checking google/protobuf/stubs/common.h presence... yes
    checking for google/protobuf/stubs/common.h... yes
    checking that generated files are newer than configure... done
    configure: creating ./config.status
    config.status: creating Makefile
    config.status: creating src/compiler/Makefile
    config.status: creating config.h
    config.status: executing depfiles commands
    config.status: executing libtool commands
    chaowudeiMac:protobuf-objc chaowu$ make
    /Applications/Xcode.app/Contents/Developer/usr/bin/make  all-recursive
    Making all in src/compiler
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cc
    mv -f .deps/main.Tpo .deps/main.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_enum_field.o -MD -MP -MF .deps/objc_enum_field.Tpo -c -o objc_enum_field.o objc_enum_field.cc
    mv -f .deps/objc_enum_field.Tpo .deps/objc_enum_field.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_file.o -MD -MP -MF .deps/objc_file.Tpo -c -o objc_file.o objc_file.cc
    mv -f .deps/objc_file.Tpo .deps/objc_file.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_message_field.o -MD -MP -MF .deps/objc_message_field.Tpo -c -o objc_message_field.o objc_message_field.cc
    mv -f .deps/objc_message_field.Tpo .deps/objc_message_field.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_enum.o -MD -MP -MF .deps/objc_enum.Tpo -c -o objc_enum.o objc_enum.cc
    mv -f .deps/objc_enum.Tpo .deps/objc_enum.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_generator.o -MD -MP -MF .deps/objc_generator.Tpo -c -o objc_generator.o objc_generator.cc
    mv -f .deps/objc_generator.Tpo .deps/objc_generator.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_primitive_field.o -MD -MP -MF .deps/objc_primitive_field.Tpo -c -o objc_primitive_field.o objc_primitive_field.cc
    mv -f .deps/objc_primitive_field.Tpo .deps/objc_primitive_field.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_extension.o -MD -MP -MF .deps/objc_extension.Tpo -c -o objc_extension.o objc_extension.cc
    mv -f .deps/objc_extension.Tpo .deps/objc_extension.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_helpers.o -MD -MP -MF .deps/objc_helpers.Tpo -c -o objc_helpers.o objc_helpers.cc
    objc_helpers.cc:363:13: warning: enumeration values 'OBJECTIVECTYPE_STRING',
          'OBJECTIVECTYPE_DATA', and 'OBJECTIVECTYPE_MESSAGE' not handled in switch
          [-Wswitch]
        switch (type) {
                ^
    objc_helpers.cc:423:13: warning: enumeration values 'OBJECTIVECTYPE_STRING',
          'OBJECTIVECTYPE_DATA', and 'OBJECTIVECTYPE_MESSAGE' not handled in switch
          [-Wswitch]
        switch (GetObjectiveCType(field)) {
                ^
    2 warnings generated.
    mv -f .deps/objc_helpers.Tpo .deps/objc_helpers.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_field.o -MD -MP -MF .deps/objc_field.Tpo -c -o objc_field.o objc_field.cc
    mv -f .deps/objc_field.Tpo .deps/objc_field.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objc_message.o -MD -MP -MF .deps/objc_message.Tpo -c -o objc_message.o objc_message.cc
    mv -f .deps/objc_message.Tpo .deps/objc_message.Po
    g++ -DHAVE_CONFIG_H -I. -I../..     -g -O2 -DNDEBUG -MT objectivec-descriptor.pb.o -MD -MP -MF .deps/objectivec-descriptor.pb.Tpo -c -o objectivec-descriptor.pb.o `test -f 'google/protobuf/objectivec-descriptor.pb.cc' || echo './'`google/protobuf/objectivec-descriptor.pb.cc
    mv -f .deps/objectivec-descriptor.pb.Tpo .deps/objectivec-descriptor.pb.Po
    /bin/sh ../../libtool  --tag=CXX   --mode=link g++  -g -O2 -DNDEBUG -lprotobuf -lprotoc  -o protoc-gen-objc main.o objc_enum_field.o objc_file.o objc_message_field.o objc_enum.o objc_generator.o objc_primitive_field.o objc_extension.o objc_helpers.o objc_field.o objc_message.o objectivec-descriptor.pb.o  
    libtool: link: g++ -g -O2 -DNDEBUG -o protoc-gen-objc main.o objc_enum_field.o objc_file.o objc_message_field.o objc_enum.o objc_generator.o objc_primitive_field.o objc_extension.o objc_helpers.o objc_field.o objc_message.o objectivec-descriptor.pb.o -Wl,-bind_at_load  -lprotobuf -lprotoc
    make[2]: Nothing to be done for `all-am'.
    chaowudeiMac:protobuf-objc chaowu$ make install
    Making install in src/compiler
     ../.././install-sh -c -d '/usr/local/bin'
      /bin/sh ../../libtool   --mode=install /usr/bin/install -c protoc-gen-objc '/usr/local/bin'
    libtool: install: /usr/bin/install -c protoc-gen-objc /usr/local/bin/protoc-gen-objc
    make[2]: Nothing to be done for `install-data-am'.
    make[2]: Nothing to be done for `install-exec-am'.
    make[2]: Nothing to be done for `install-data-am'.
    chaowudeiMac:protobuf-objc chaowu$ cd ..
    chaowudeiMac:desktop chaowu$ protoc --proto_path=. --objc_out=. im.msg.proto
    im.msg.proto: No such file or directory
    chaowudeiMac:desktop chaowu$ protoc --proto_path=. --objc_out=. im_msg.proto
    chaowudeiMac:desktop chaowu$  protoc --proto_path=. --objc_out=. im_msg.proto
    chaowudeiMac:desktop chaowu$ 
    首先,打开终端!
    ?

    1 brew -v


    :查看你的mac里面有没有装brew。brew是mac os里面,类似于ubuntu的apt-get的功能,都可以直接在终端输入命令然后安装程序。-v自然就是版本version的意思
    ?

    1 ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)


    这一句半懂不懂,,大概就是利用curl工具访问那个url,然后在ruby环境下载安装brew
    ?

    123 brew install automakebrew install libtoolbrew install protobuf

    Homebrew 的使用方法也很简单。

    基本用法

    • brew search formula # 搜索软件包
    • brew install formula # 安装软件包
    • brew remove formula # 移除软件包
    • brew cleanup formula # 清除旧包
    • brew list # 列出已安装的软件包
    • brew update # 更新 Homebrew
    • brew upgrade # 升级软件包
    • brew home formula # 用浏览器打开
    • brew info formula # 显示软件内容信息
    • brew deps formula # 显示包的依赖
    • brew server # 启动 web 服务器,可以通过浏览器访问 http://localhost:4567 来通过网页来管理包
    • brew -h # 帮助
    • brew versions formula # 列出软件包的版本

     4.新建一个工程,将生成的personOC版的文件导入,然后将ProtocolBuffers-2.2.0-Source/objectivec下的文件放到项目的目录下,创建一个ProtobufLib文件夹,放进去,最好放在一个文件夹下面像这样复制代码

     1 message Person { 2 required string name = 1; 3 required int32 id = 2; 4 optional string email = 3; 5  6 enum PhoneType { 7 MOBILE = 0; 8 HOME = 1; 9 WORK = 2;10 }11 12 message PhoneNumber {13 required string number = 1;14 optional PhoneType type = 2 [default = HOME];15 }16 17 repeated PhoneNumber phone = 4;18 }

    复制代码

      B.ProtocolBuffers-2.2.0-Source下创建这样一个子目录build/objc以便存放我们生成的classes

    现在执行命令:

    src/protoc --proto_path=src --objc_out=build/objc src/Person.proto

    成功后会在build/objc下生成Person.pd.h 和 Person.pb.m 两个Object-C文件

    3、测试

      A.新建一个项目ProtobufDemo,将刚才生成的两个文件加入项目。然后将ProtocolBuffers-2.2.0-Source/objectivec 下的文件放到项目的目录下,最好放在一个文件夹下面像这样

    创建一个ProtobufLib文件夹,放进去.

      B.之后把ProtocolBuffers.xcodeproj添加到项目中,我习惯将它放到Frameworks下。

      C.然后双击Targets下的ProtobufDemo,点击+添加,之后做一些配置,like this

    在.pch文件中导入 #import "ProtocolBuffers.h"

    配置好这些之后编译你的项目,应该不会报错了吧。

  • 相关阅读:
    Redis订阅和发布模式和Redis事务
    Redis介绍和环境安装
    Redis基本数据类型
    MongoDB导入导出以及数据库备份
    MongoDB-python的API手记
    MongoDB对应SQL语句
    判断是否微信浏览器访问并得到微信版本号
    windows 下编译php扩展库pecl里的扩展memcache
    用PHPExcel类读取excel文件的内容
    用excel.php类库导出excel文件
  • 原文地址:https://www.cnblogs.com/changzheng/p/4811300.html
Copyright © 2020-2023  润新知