一.前言
? ? ? ?這幾天和開發(fā)jni的同學(xué)對接SDK臼隔,其中包含了protobuffer和openssl庫祈噪,這里主要說一下protobuffer編譯mac環(huán)境靜態(tài)庫過程及遇到的問題,在此記錄下來供后續(xù)參考眷射,由于對linux及英文不是很熟焚廊,過程中也感謝生才同學(xué)的協(xié)助知允!
當(dāng)拿到j(luò)ni的時候闯捎,處理了header search path路徑問題后,又出現(xiàn)了另一個報錯许溅,一臉懵逼瓤鼻!
其實(shí)是由于libprotobuf-lite.a靜態(tài)庫不符合我們當(dāng)下的arm64 ?arm64e ?x86_64 ?armv7 等環(huán)境,所以需要重新編譯一個符合mac系統(tǒng)環(huán)境下的靜態(tài)庫贤重。
其實(shí)在我們開發(fā)過程中也可以用命令來校驗(yàn)當(dāng)前庫的符合的環(huán)境茬祷,
格式是:lipo -info 要檢驗(yàn)的庫路徑
例:lipo -info /Users/zhaoyonghong/Desktop/openssl/lib/libssl.a
執(zhí)行結(jié)果如下:
(如果不符合的話,會提示沒有找到對應(yīng)編譯環(huán)境并蝗,這時候就需要重新編譯庫了)
(如果符合祭犯,會將對應(yīng)的環(huán)境顯示出來)
二.具體步驟
官方鏈接(需要翻墻):https://developers.google.com/cardboard/develop/ios/protobuf
首先選擇對應(yīng)版本下載protobuffer源碼,我們用的是 protobuf-3.6.1滚停,mac下安裝C++版本的博客網(wǎng)上極少存在沃粗,有的也真的沒有一個合適。下面列出過程中需要用到的命令:
1.檢查是否安裝
?protoc --version
2.clone源碼
git clone?https://github.com/protocolbuffers/protobuf.git
3.下載你想要的版本
git checkout v3.10.1
4.下載以后cd到目錄下后執(zhí)行
./autogen.sh
5.創(chuàng)建環(huán)境變量
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++"
6.創(chuàng)建輸出目錄
mkdir -p $build_dir/arch
mkdir -p $build_dir/lib
7.配置64位生成環(huán)境
./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"
8.構(gòu)建64位庫
make?-j8
make?install
9.清除協(xié)議緩沖區(qū)目錄
make distclean
10.配置32位庫生成環(huán)境
./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"
11.構(gòu)建32位庫
make?-j8
make?install
12.編譯對應(yīng)兩個文件a
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
13.刪除未使用的庫
rm -rf $build_dir/arch
14.到此靜態(tài)庫生成完畢键畴,在protobuf中包含兩個文件最盅,分別是include和lib,導(dǎo)入到自己的工程就可以愉快的擼代碼了
proto
├── cardboard_device.pb.cc
├── cardboard_device.pb.h
└── libprotobuf
? ? └── ios
├──?include
? ? ? ? │ ? └── google/*
? ? ? ? └── lib
? ? ? ? ? ? └── libprotobuf-lite.a