美文网首页
iOS protobuf 静态库编译

iOS protobuf 静态库编译

作者: ahyin007 | 来源:发表于2020-05-19 14:24 被阅读0次

编译

准备

  • 下载需要的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

参考

感谢 小码哥
感谢 每天1990

相关文章

  • iOS protobuf 静态库编译

    编译 准备 下载需要的protobuf zip源文件 下载gtest源文件,解压后重命名为gtest放到proto...

  • 创建静态库

    iOS深入学习(创建静态库static library) 库包含静态库和动态链接库,他们之间区别是:静态库可以编译...

  • Mac下交叉编译iOS端静态库(.a)

    实际开发过程中,遇到编译iOS库时,用到的第三方静态库不是iOS平台的,因此需要自己编译静态库使用。下载第三库的源...

  • iOS静态库和动态库的区别

    iOS开发中静态库和动态库区别: 静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程...

  • iOS静态库和动态库的使用

    iOS开发中静态库和动态库区别 静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序...

  • iOS静态库及动态库

    2018-06-19 浅析静态库链接原理编译原理以及什么是静态库和动态库 转之: iOS 静态库和动态库(库详解)...

  • 创建SDK

    一.IOS库简介 静态库与动态库 静态库:在编译的时候会被直接拷贝一份,复制到目标程序里。牺牲app体积来减少编译...

  • Protobuf的一个链接错误

    Xcode 中编译protobuf, 编译没有问题,上层库链接protobuf库的时候报6链接错误 : 排查:函...

  • iOS 使用Gmssl实现SM2证书签名验签

    如果没有编译gmssl,可以看下: iOS 编译Gmssl 编译好iOS可以用的Gmssl静态库之后,需要在Gms...

  • Embedded Binaries 和 Linked Frame

    1:iOS 动态库与静态库的区别(framework,.a,.dylib) 一点通俗的理解: 1)静态库:编译期间...

网友评论

      本文标题:iOS protobuf 静态库编译

      本文链接:https://www.haomeiwen.com/subject/rxkbohtx.html