在Flutter的C++代码中使用Protobuf 3:如何正确编译与链接?
Flutter C++集成Protobuf实操方案
以下为全平台兼容的落地步骤,可直接复用:
1. 版本选择
不要使用最新版Protobuf,优先选择3.20.x或3.19.x分支版本,该版本对各平台交叉编译的兼容性最好,可规避大量ABI、接口不兼容问题。
2. 分平台编译Protobuf
Android平台编译
- 提前安装Flutter官方推荐的NDK版本r21e或r23b,配置环境变量
ANDROID_NDK_HOME - 解压Protobuf源码后,在根目录新建
build_android.sh脚本,内容如下:
#!/bin/bash ABI_LIST=("armeabi-v7a" "arm64-v8a" "x86" "x86_64") for ABI in ${ABI_LIST[@]} do mkdir -p build_android/$ABI cd build_android/$ABI cmake ../../cmake \ -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=$ABI \ -DANDROID_PLATFORM=android-21 \ -Dprotobuf_BUILD_TESTS=OFF \ -Dprotobuf_BUILD_SHARED_LIBS=OFF \ -DCMAKE_INSTALL_PREFIX=../../install_android/$ABI make -j8 make install cd ../../ done
- 执行脚本后,头文件和对应架构的静态库会输出到
install_android目录下
iOS/macOS平台编译
- 在Protobuf源码根目录新建
build_ios.sh脚本,内容如下:
#!/bin/bash mkdir -p build_ios cd build_ios cmake ../cmake \ -DCMAKE_SYSTEM_NAME=iOS \ -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \ -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 \ -Dprotobuf_BUILD_TESTS=OFF \ -Dprotobuf_BUILD_SHARED_LIBS=OFF \ -DCMAKE_INSTALL_PREFIX=../install_ios make -j8 make install
Windows桌面编译
- 打开Visual Studio命令行工具,执行以下命令:
mkdir build_win cd build_win cmake ..\cmake -G "Visual Studio 17 2022" -A x64 -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=..\install_win cmake --build . --config Release --target install
3. 集成到Flutter C++项目
- 将编译好的所有平台的Protobuf头文件(源码
src/google目录)拷贝到项目C++侧的third_party/protobuf/include目录 - 各平台编译生成的静态库
libprotobuf.a(Android/iOS)、libprotobuf.lib(Windows)放到对应平台的库目录 - 修改C++模块的
CMakeLists.txt,添加如下配置:
include_directories(third_party/protobuf/include) # Android平台链接配置 if(ANDROID) add_library(protobuf STATIC IMPORTED) set_target_properties(protobuf PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf/lib/android/${ANDROID_ABI}/libprotobuf.a) endif() # iOS平台链接配置 if(IOS) add_library(protobuf STATIC IMPORTED) set_target_properties(protobuf PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf/lib/ios/libprotobuf.a) endif() # 将protobuf加入目标链接库列表 target_link_libraries( your_native_lib_name protobuf # 其他依赖库 )
4. 功能验证
- 本地安装对应版本的protoc工具,执行命令生成C++业务代码:
protoc --cpp_out=./generated your_business.proto - 将生成的
.pb.h、.pb.cc文件加入C++项目源码列表,即可正常调用Protobuf API完成序列化、反序列化操作
常见问题规避
- 全程使用静态编译的Protobuf库,不要用动态库,避免Flutter加载时出现符号冲突
- 编译Protobuf用的NDK版本必须和Flutter项目使用的NDK版本完全一致,否则会出现链接ABI不兼容错误
- 不需要开启Protobuf的RTTI、异常支持,和Flutter C++默认环境配置冲突,可额外添加编译参数
-Dprotobuf_ENABLE_RTTI=OFF -Dprotobuf_BUILD_EXAMPLES=OFF减少体积
内容的提问来源于stack exchange,提问作者ch271828n
相关产品推荐
相关产品推荐

