how to build protocol buffer for iOS7?

2019-07-19 07:24发布

I want to rebuild protocol buffer staticlib in xcode5 ,
download protocol buffer in http://code.google.com/p/protobuf/downloads/list use autogen.sh , I get a configure file, can make and install on mac, I write a shell script try to build glib for iOS, as blow :

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

When I run this script, return as :

#error Unsupported architecture

What can I do?

in ios6, xcode 4.6, i can use this configure file to build, but in xcode5, llvm-gcc has removed, i use clang to replace it, but is failed.

in ios6 , use this

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

3条回答
Ridiculous、
2楼-- · 2019-07-19 07:53

From the above script its understood that you are trying to build protobuf for different architectures like (armv7, armv7s ..etc) by default OSX build protobuf for 64 or 32 bit architecture. Which may not support in ios devices which have different cpu architecture.

Steps to build protobuf for arm architecture:

  • Before running any configure scripts make sure you have installed proto buffer with default configuration using (./configure, make and make install).

  • Check for protobuf version using "protoc --version" for confirmation. If protoc command not found check for environmental variable. This may happen when you didn't build protobuf in default location "/usr/local/bin/protoc". This step is important since we need to pass protoc in --with-protoc variable while configuring for different architecture.

  • Go to the source where you unzipped your downloaded protobuffer and run the below script by having it in some *.sh file.

    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}/Developer/${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}/Developer/SDKs/${SIM_SDK}.sdk

    PREFIX="your default location"

    CC=clang CFLAGS="-DNDEBUG -g -O0 -pipe -fPIC -fcxx-exceptions" CXX=clang 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}"

  • Then run make and make install.

  • Now you will have new libprotobuf.a static library in ${PREFIX}/platform/arvm7/lib location which you need to have it in your xcode project for compiling protoc generated c++ file.

查看更多
虎瘦雄心在
3楼-- · 2019-07-19 07:56

I wrote a small bash script that builds Protobuf for iOS 7. The script can be found here.

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

This script will produce a proper build of Google Protobuf that supports the i386, armv7, armv7s, arm64 and x86_64 architectures. It will produce a static library that is universal. It will also produce the protoc compiler for use on OS X.

查看更多
ら.Afraid
4楼-- · 2019-07-19 08:16

remove those two lines

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

then add -isysroot and -arch to

export CPPFLAGS="-pipe -no-cpp-precomp -I$SDKROOT/usr/include"
查看更多
登录 后发表回答