让gRPC动态库变得短小精悍

之前对strip还一脸懵逼,刚好在makefile中搜索到关键字,依葫芦画瓢测试一波,果然成功了,后来发现只要一条命令就解决的事情。还是记录下自己解决问题的过程吧。

修改grpc目录下的makefile
修改前:

修改后:

将自己要strip的库添加进去,库文件存放的路径是在grpc/libs/opt下。
执行命令

make strip-shared_c -j8 HAS_PKG_CONFIG=false CC=arm-oe-linux-gnueabi-gcc CXX=arm-oe-linux-gnueabi-g++ RANLIB=arm-oe-linux-gnueabi-ranlib LD=arm-oe-linux-gnueabi-ld LDXX=arm-oe-linux-gnueabi-g++ AR=arm-oe-linux-gnueabi-ar STRIP=arm-oe-linux-gnueabi-strip CPP=arm-oe-linux-gnueabi-cpp PREFIX=/home/workspace/test/arm_install PROTOBUF_CONFIG_OPTS="--host=arm-oe-linux-gnueabi --with-protoc=/usr/local/bin/protoc"

压缩成功:

后面百度一下,查找资料发现其实可以单独使用命令来对已经编译完的动态库进行压缩。测试发现libgrpc.so.9没有变化,那么说明它编译过程中已经有strip过了。
man strip

再查看交叉编译的arm-oe-linux-gnueabi-strip.

原来arm-oe-linux-gnueabi-strip并不是压缩库而是去除一些调试信息和符号信息。

为了保证动态库正常使用,使用–strip-unneeded。删除所有不需要重新定位的符号。保留一些可用的符号。

哎,之前没搞过,原来只要一条命令就解决的问题。
arm-oe-linux-gnueabi-strip --strip-unneeded libgrpc++_reflection.so


库大小的问题算是解决了,开始看看example源码学习下grpc与protobuf如何使用吧。

在 Windows 平台下使用 gRPC 动态库(DLL)时,开发者通常需要完成以下几个步骤:构建 gRPC 动态库、配置项目依赖项、编写客户端与服务端代码,并确保运行时环境的兼容性。以下是详细的使用方法和配置指南: ### 构建 gRPC 动态库 1. **安装 Vcpkg** 从 GitHub 获取 vcpkg 工具并集成到 Visual Studio 环境中,用于管理第三方库的安装和配置。 ```powershell git clone https://github.com/Microsoft/vcpkg.git cd vcpkg .\bootstrap-vcpkg.bat .\vcpkg integrate install ``` 2. **安装 gRPC 及其依赖项** 使用以下命令安装 gRPC动态库版本: ```powershell .\vcpkg install grpc:x64-windows ``` 此命令会自动下载并编译 gRPC 及其所有依赖项,包括 Protobuf、Abseil、Re2 等[^1]。 3. **获取 gRPC 源码并手动构建(可选)** 若需自定义构建流程或调试 gRPC 源码,可以从 [gRPC 官方仓库](https://github.com/grpc/grpc) 克隆源码,并通过 CMake 配置生成适用于 Visual Studio 的项目文件进行构建。 ### 配置 Visual Studio 项目以使用 gRPC 动态库 1. **设置包含目录(Include Directories)** 在 Visual Studio 项目的属性页中,添加 gRPC 和 Protobuf 的头文件路径,例如: ``` $(VCPKG_ROOT)\installed\x64-windows\include ``` 2. **设置库目录(Library Directories)** 添加 gRPC 和 Protobuf 的 DLL 导入库(`.lib` 文件)路径: ``` $(VCPKG_ROOT)\installed\x64-windows\lib ``` 3. **链接 gRPC 库文件** 在项目的链接器输入(Linker → Input)中添加以下依赖项: ``` grpc++.lib;grpc.lib;protobuf.lib;absl_*.lib ``` 4. **运行时 DLL 路径配置** 将 gRPC 相关的 `.dll` 文件复制到项目的输出目录(如 `Debug` 或 `Release` 文件夹),或者将它们所在的路径加入系统 `PATH` 环境变量中[^1]。 ### 编写 gRPC 客户端与服务端代码 1. **定义 `.proto` 接口文件** 创建一个 `.proto` 文件来定义服务接口和数据结构: ```protobuf syntax = "proto3"; package example; message HelloRequest { string name = 1; } message HelloReply { string message = 1; } service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); } ``` 2. **使用 `protoc` 编译 `.proto` 文件生成 C++ 代码** 使用 gRPC 提供的 `protoc` 插件生成服务端和客户端桩代码: ```powershell protoc --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc="path_to_grpc_cpp_plugin" greeter.proto ``` 3. **实现服务逻辑** 在服务端代码中继承生成的服务基类并重写 RPC 方法: ```cpp class GreeterServiceImpl final : public Greeter::Service { Status SayHello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override { std::string prefix("Hello "); reply->set_message(prefix + request->name()); return Status::OK; } }; ``` 4. **启动 gRPC 服务并运行客户端调用** 在主函数中创建并启动 gRPC 服务器,同时实现客户端调用逻辑。 ### 常见问题及解决办法 - **找不到 `.dll` 文件**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值