我尝试用两种方式构建 grpc c++。一种带有 -DBUILD_SHARED_LIBS=ON,另一种不带有。
关闭时,进入lib/目录,例如:
360M libgrpc.a
(任何其他库)
当它打开时,我进入lib/目录
lrwxrwxrwx 1 root root 13 Jul 8 11:32 grpc_so/lib/libgrpc.so -> libgrpc.so.41
lrwxrwxrwx 1 root root 17 Jul 8 11:32 grpc_so/lib/libgrpc.so.41 -> libgrpc.so.41.0.0
-rw-r--r-- 1 root rot 58M Jul 8 11:30 grpc_so/lib/libgrpc.so.41.0.0
(以及许多其他 .so 文件)
为什么文库大小差异如此之大?我读到静态库包含其依赖项,但事实上,即使在静态构建中,我也确实在 lib/ 文件夹中看到了 grpc 的其他依赖项(例如 libabsl*.a 文件),所以它不像
libgrpc.a
是自包含的。
所有其他库在静态构建中也具有更大的大小。这些 .a 文件包含哪些 .so 文件不包含的内容?
我正在尝试获得一个小型的、仅运行时的 grpc c++ 版本。不确定我是否应该将其编译为共享库。
我建议不要在应用程序之外测量库大小。尝试构建您的应用程序,让链接器删除不必要的代码。 Bazel 也可能有助于修剪不必要的代码。
例如在 Linux x86-64 上使用 Bazel 构建欢迎服务器:
bazel build -c opt //examples/cpp/helloworld:greeter_server
生成一个 13M 的可执行文件。通过禁用 xDS 等可能会进一步减少。