Mac 编译 Protobuffer Universal 的 dylib
2025年3月19日大约 1 分钟
最近在适配 Mac 客户端(x86_64、Arm64),项目里引用了 Protobuffer,因为整个工程最终产物就是 Universal 的,想着是编一个 Universal 的 Protobuffer 库,这样引用也比较方便。查了一圈网上没有,最后找 AI 解决的。
编译
我这里编译的是一个较老的版本 3.21.12,编译步骤(引自项目 Readme):
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make -j$(nproc) # $(nproc) ensures it uses all cores for compilation
make check
sudo make install
sudo ldconfig # refresh shared library cache.
只要在 configure 阶段增加些参数即可:
./configure CXXFLAGS="-arch arm64 -arch x86_64 -mmacosx-version-min=10.15" LDFLAGS="-arch arm64 -arch x86_64 -mmacosx-version-min=10.15"
-arch 来指定两个架构。-mmacosx-version-min,这个选项会决定 STL 的编译是用 GNU 还是 LLVM,如果不指定这个,在 Intel 的系统上跑起来会崩溃,报一个 libc++ 中找不到符号的错误。
调整库加载路径
直接这样编译出来的库,localpath 是 /usr/local/lib 是默认的安装目录,如果是放在自己的程序中加载,需要写成相对路径,应该是可以在 configure 中指定,不过我是编译之后用工具再调整的。
install_name_tool -id "@loader_path/../Frameworks/libprotobuf-lite.32.dylib" libprotobuf-lite.32.dylib
这样调整完之后再放入项目中打包,加载逻辑就是正常的了。
赞助