如何为iOS7构建协议缓冲区?

时间:2013-09-25 02:07:35

标签: ios7 protocol-buffers xcode5

我想在xcode5中重建协议缓冲区staticlib,
 在http://code.google.com/p/protobuf/downloads/list下载协议缓冲区 使用autogen.sh,我得到一个配置文件,可以在mac上制作和安装,我写了一个shell脚本尝试为iOS构建glib,作为打击:

export ARCH=arm-apple-darwin10
export ARCH_PREFIX=${ARCH}-
export PLATFORM=iPhoneOS

export SDKVER=7.0
export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer
export SDKROOT="$DEVROOT/SDKs/${PLATFORM}$SDKVER.sdk"

export Toolchains=/Applications/Xcode.app/Contents/Developer/Toolchains
export XcodeClangBin="$Toolchains/XcodeDefault.xctoolchain/usr/bin"
export XcodeCpp="$Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp"

export PKG_CONFIG_PATH="$SDKROOT/usr/lib/pkgconfig:$DEVROOT/usr/lib/pkgconfig"
export AS="$DEVROOT/usr/bin/as"
export ASCPP="$DEVROOT/usr/bin/as"
export AR="$DEVROOT/usr/bin/ar"
export RANLIB="$DEVROOT/usr/bin/ranlib"
export CPP="$XcodeCpp"
export CXXCPP="$XcodeCpp"
export CC="$XcodeClangBin/clang"
export CXX="$XcodeClangBin/clang++"
export LD="$DEVROOT/usr/bin/ld"
export STRIP="$DEVROOT/usr/bin/strip"

export CPPFLAGS="-pipe -no-cpp-precomp -I$SDKROOT/usr/include"
export CFLAGS="-arch armv7 -arch armv7s -fmessage-length=0 -pipe -fpascal-strings -no-cpp-precomp -miphoneos-version-min=5.0 --sysroot='$SDKROOT' -isystem $SDKROOT/usr/include"
export CXXFLAGS="$CFLAGS -I$SDKROOT/usr/include/c++/4.2.1/${ARCH}/v6"
export LDFLAGS="--sysroot='$SDKROOT' -L$SDKROOT/usr/lib -L$SDKROOT/usr/lib/system"

./configure --host=${ARCH} --with-protoc=protoc --enable-static --disable-shared --prefix=/tmp/protobuf/arm
make clean
make
make check
make install

当我运行此脚本时,返回为:

#error Unsupported architecture

我该怎么办?

在ios6,xcode 4.6中,我可以使用这个配置文件进行构建,但是在xcode5中,llvm-gcc已经删除,我使用clang替换它,但是失败了。

在ios6中

,使用此

export CPP="$DEVROOT/usr/bin/llvm-cpp-4.2"
export CXXCPP="$DEVROOT/usr/bin/llvm-cpp-4.2"

3 个答案:

答案 0 :(得分:2)

我写了一个小的bash脚本,为iOS 7构建Protobuf。可以在这里找到脚本。

https://gist.github.com/BennettSmith/7150245

此脚本将生成适当的Google Protobuf版本,支持i386,armv7,armv7s,arm64和x86_64架构。它将生成一个通用的静态库。它还将生成用于OS X的protoc编译器。

答案 1 :(得分:0)

删除这两行

export CPP="$XcodeCpp"
export CXXCPP="$XcodeCpp"

然后将-isysroot和-arch添加到

export CPPFLAGS="-pipe -no-cpp-precomp -I$SDKROOT/usr/include"

答案 2 :(得分:0)

从上面的脚本中可以看出,您正在尝试为64或32位架构的默认OSX构建protobuf构建不同体系结构(如armv7,armv7s ..etc)的protobuf。哪些可能不支持具有不同cpu架构的ios设备。

为arm架构构建protobuf的步骤:

  • 在运行任何配置脚本之前,请确保已安装 使用默认配置的proto缓冲区(./configure,make和 make install)。

  • 使用" protoc --version "检查protobuf版本确认。如果未找到protoc命令,请检查环境变量。如果您没有在默认位置" / usr / local / bin / protoc"中构建protobuf,则可能会发生这种情况。这一步非常重要,因为我们需要在配置不同架构时在 - with-protoc 变量中传递 protoc

  • 转到您解压缩下载的protobuffer的源代码,然后在一些 *。sh 文件中运行以下脚本。

      

    XCODEDIR = xcode-select --print-path

         

    OSX_SDK = $(xcodebuild -showsdks | grep macosx | sort | head -n 1 | awk' {print $ NF}')   IOS_SDK = $(xcodebuild -showsdks | grep iphoneos | sort | head -n 1 | awk' {print $ NF}')   SIM_SDK = $(xcodebuild -showsdks | grep iphonesimulator | sort | head -n 1 | awk' {print $ NF}')

         

    MACOSX_PLATFORM = $ {XCODEDIR} /Platforms/MacOSX.platform   MACOSX_SYSROOT = $ {MACOSX_PLATFORM} /开发人员/ $ {OSX_SDK} .sdk

         

    IPHONEOS_PLATFORM = $ {XCODEDIR} /Platforms/iPhoneOS.platform   IPHONEOS_SYSROOT = $ {IPHONEOS_PLATFORM} /Developer/SDKs/iPhoneOS8.1.sdk

         

    IPHONESIMULATOR_PLATFORM = $ {XCODEDIR} /Platforms/iPhoneSimulator.platform   IPHONESIMULATOR_SYSROOT = $ {IPHONESIMULATOR_PLATFORM} /开发商/软件开发工具包/ $ {SIM_SDK} .sdk

         

    PREFIX = "您的默认位置"

         

    CC =铛   CFLAGS =" -DNDEBUG -g -O0 -pipe -fPIC -fcxx-exceptions"   CXX =铛   CXXFLAGS =" $ {CFLAGS} -std = c ++ 11 -stdlib = libc ++"   LDFLAGS =" -stdlib = libc的++"   LIBS =" -lc ++ -lc ++ abi"

         

    ./ configure --build = x86_64-apple-darwin13.0.0 --host = armv7-apple-darwin13.0.0 --with-protoc = protoc --disable-shared --prefix = $ {PREFIX} - exec-prefix = $ {PREFIX} / platform / armv7" CC = $ {CC}" " CFLAGS = $ {CFLAGS} -miphoneos-version-min = 8.0 -arch armv7 -isysroot $ {IPHONEOS_SYSROOT}" " CXX = $ {CXX}" " CXXFLAGS = $ {CXXFLAGS} -arch armv7 -isysroot $ {IPHONEOS_SYSROOT}" LDFLAGS =" -arch armv7 -miphoneos-version-min = 8.0 $ {LDFLAGS}" " LIBS = $ {LIBS}"

  • 然后运行make并make install。

  • 现在您将在 $ {PREFIX} / platform / arvm7 / lib 位置安装新的libprotobuf.a静态库,您需要在xcode项目中将其用于编译protoc生成的c ++文件