3

我想在 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"
4

3 回答 3

2

我编写了一个为 iOS 7 构建 Protobuf 的小 bash 脚本。可以在此处找到该脚本。

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

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

于 2013-12-14T05:31:02.433 回答
0

删除这两行

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

然后将 -isysroot 和 -arch 添加到

export CPPFLAGS="-pipe -no-cpp-precomp -I$SDKROOT/usr/include"
于 2013-10-02T11:13:30.807 回答
0

从上面的脚本可以理解,您正在尝试为不同的架构构建 protobuf,例如(armv7、armv7s ..etc),默认情况下 OSX 为 64 位或 32 位架构构建 protobuf。在具有不同 cpu 架构的 ios 设备中可能不支持。

为 arm 架构构建 protobuf 的步骤:

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

  • 使用“ protoc --version ”检查 protobuf 版本以进行确认。如果未找到 protoc 命令,请检查环境变量。当您没有在默认位置“/usr/local/bin/protoc”中构建 protobuf 时,可能会发生这种情况。这一步很重要,因为我们需要在配置不同的架构时将protoc传递到--with-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}/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= "您的默认位置"

    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}"

  • 然后运行 ​​make 和 make install。

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

于 2014-11-13T09:43:07.520 回答