iOS protobuf 静态库编译

编译

准备

  • 下载需要的protobuf zip源文件
  • 下载gtest源文件,解压后重命名为gtest放到protobuf解压后的文件夹中(autogen.sh中会检查,没有则去下载)
  • 把下面的简易编译脚本放到protobuf文件夹中执行即可

arm64、armv7

#!/bin/bash
export MACOSX_DEPLOYMENT_TARGET="10.4" // 解决-fembed-bitcode与-bind_at_load冲突,10.0及以上不在使用编译选项bind_at_load

./autogen.sh

build_dir=`pwd`/libprotobuf/ios
darwin=darwin`uname -r`
protoc=`which protoc`
isysroot=`xcrun --sdk iphoneos --show-sdk-path`
// 如果不需要支持bitcode 删除 -fembed-bitcode 即可
// 另如果报 make_pair 未定义,检查编译选项中是否指定了 -std=c++11 这里不需要再指定
cflags="-Wno-unused-local-typedef -Wno-unused-function -DNDEBUG -g -O0 -pipe -fPIC -fcxx-exceptions -fembed-bitcode"
cxxflags="$cflags -stdlib=libc++"

mkdir -p $build_dir/arch
mkdir -p $build_dir/lib

// 清空中间产物
make distclean

./configure \
--build=x86_64-apple-$darwin \
--host=arm \
--with-protoc=$protoc \
--disable-shared \
--prefix=$build_dir \
--exec-prefix=$build_dir/arch/arm64 \
"CC=clang" \
"CFLAGS=$cflags -miphoneos-version-min=9.0 -arch arm64 -isysroot $isysroot" \
"CXX=clang" \
"CXXFLAGS=$cxxflags -miphoneos-version-min=9.0 -arch arm64 -isysroot $isysroot" \
LDFLAGS="-arch arm64 -miphoneos-version-min=9.0 -stdlib=libc++" \
"LIBS=-lc++ -lc++abi"

make -j8
make install

make distclean

./configure \
--build=x86_64-apple-$darwin \
--host=armv7-apple-$darwin \
--with-protoc=$protoc \
--disable-shared \
--prefix=$build_dir \
--exec-prefix=$build_dir/arch/armv7 \
"CC=clang" \
"CFLAGS=$cflags -miphoneos-version-min=9.0 -arch armv7 -isysroot $isysroot" \
"CXX=clang" \
"CXXFLAGS=$cxxflags -miphoneos-version-min=9.0 -arch armv7 -isysroot $isysroot" \
LDFLAGS="-arch armv7 -miphoneos-version-min=9.0 -stdlib=libc++" \
"LIBS=-lc++ -lc++abi"

make -j8
make install

lipo \
$build_dir/arch/arm64/lib/libprotobuf-lite.a \
$build_dir/arch/armv7/lib/libprotobuf-lite.a \
-create \
-output $build_dir/lib/libprotobuf-lite.a

rm -rf $build_dir/arch

同其他静态库一样引用到工程即可。

安装protoc

如果需要安装到本地,切换到protobuf文件夹下顺序执行下面命令

./autogen.sh // 生成下面的configure
./configure
make // google/protobuf/message.cc:175:16: error: implicit instantiation of undefined template
// 'std::__1::basic_istream >' 添加文件引用 #include 
make check // 按顺序执行到这一步再报 gtest-port.h:348:10: fatal error: 'tr1/tuple' file not found 继续执行下面命令也是能安装成功的
make install

查看安装结果

which protoc
// 版本
protoc --version

问题

上面已经注释

  • -bind_at_load and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together
  • -fembed-bitcode
  • message.cc:175:16: error: implicit instantiation of undefined template
  • fatal error: 'tr1/tuple' file not found

参考

感谢 小码哥
感谢 每天1990

你可能感兴趣的:(iOS protobuf 静态库编译)