编译
准备
- 下载需要的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<char, std::__1::char_traits<char> >' 添加文件引用 #include <istream>
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
网友评论