iOS 生成protobuf静态库

3,879 阅读1分钟

要求

生成一个3.6.1C++版本protobuf静态库

编译

github上找到protobuf

1.先下载对应版本,进入目录

2.编译静态库

找了好久,没有找到对应的方法,不过阅读能力强的,可以./configure help把每个配置选项研究下。我找到一个现成的执行命令,不过被墙了,我就搬运解释下。

  • 先执行脚本

当前目录下就有这个脚本

./autogen.sh
  • 设置环境变量
build_dir=`pwd`/../libprotobuf/ios
darwin=darwin`uname -r`
protoc=`which protoc`
isysroot=`xcrun --sdk iphoneos --show-sdk-path`
cflags="-Wno-unused-local-typedef -Wno-unused-function -DNDEBUG -g -O0 -pipe -fPIC -fcxx-exceptions"
cxxflags="$cflags -std=c++11 -stdlib=libc++"
  • 生成输出目录libprotobuf/ios/archlibprotobuf/ios/lib
mkdir -p $build_dir/arch
mkdir -p $build_dir/lib
  • 配置arm64
./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=8.0 -arch arm64 -isysroot $isysroot" \
"CXX=clang" \
"CXXFLAGS=$cxxflags -miphoneos-version-min=8.0 -arch arm64 -isysroot $isysroot" \
LDFLAGS="-arch arm64 -miphoneos-version-min=8.0 -stdlib=libc++" \
"LIBS=-lc++ -lc++abi"
  • 编译arm64
make -j8
make install
  • 清除配置
make distclean
  • 配置armv7
./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=8.0 -arch armv7 -isysroot $isysroot" \
"CXX=clang" \
"CXXFLAGS=$cxxflags -miphoneos-version-min=8.0 -arch armv7 -isysroot $isysroot" \
LDFLAGS="-arch armv7 -miphoneos-version-min=8.0 -stdlib=libc++" \
"LIBS=-lc++ -lc++abi"
  • 编译armv7
make -j8
make install
  • 合并arm64、armv7
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
  • 删除arch临时目录
rm -rf $build_dir/arch
  • 最后生成的目录
proto
├── cardboard_device.pb.cc
├── cardboard_device.pb.h
└── libprotobuf
    └── ios
        ├── include
        │   └── google/*
        └── lib
            └── libprotobuf-lite.a

libinclude拖到工程中,指定搜索目录就可以使用了。