美文网首页
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 静态库编译

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