1. 程式人生 > IOS開發 >iOS 生成protobuf靜態庫

iOS 生成protobuf靜態庫

要求

生成一個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拖到工程中,指定搜尋目錄就可以使用了。