gpt4 book ai didi

c++ - 如何优化共享库的大小?

转载 作者:可可西里 更新时间:2023-11-01 15:18:25 27 4
gpt4 key购买 nike

假设我们有大量静态库,其中包含许多不需要的功能(在下面的示例中,我们有库 lib1.alib2.a,其中包含不需要的函数 g1 ()f2()).

我们想用一些导出的方法来构建共享库,这些方法只使用那个巨大库中的几个函数/类。请参见下面的示例:我们要导出函数 foo()

问题

  1. 我们能否告诉链接器 (ld) 我们想要导出哪些函数/方法(就像我们在 Windows 中为 DLL 做的那样)?
  2. 链接器能否解决依赖关系并删除不需要的函数/方法?或者有什么其他的方法可以解决这个问题?
  3. 如果您有解决方案,请为下面的示例编写修复程序。

示例

文件1.h:

int f1( int n );
int g1( int n );

文件2.h:

int f2( int n );

文件foo.cpp:

#include "1.h"
#include "2.h"

int foo( int n )
{
return f1( n );
}

文件1.cpp:

int f1( int n ) { return n; }
int g1( int n ) { return n; }

文件2.cpp:

int f2( int n ) { return n; }

文件 makefile:

CXXFLAGS = -g -I. -Wall -Wno-sign-compare

all: prepare libFoo.so

clean:
rm -f obj/*.a obj/*.o res/*.so

prepare:
mkdir -p src
mkdir -p obj
mkdir -p res

lib1.a lib2.a: lib%.a: %.o
ar r obj/$@ obj/$*.o

1.o 2.o foo.o: %.o:
g++ $(CXXFLAGS) -c -o obj/$@ src/$*.cpp

libFoo.so: lib1.a lib2.a foo.o
ld -shared -o res/libFoo.so obj/foo.o -Lobj -l1 -l2

在创建目标 all 之后,我们有 nm res/libFoo.so:

...
000001d8 T _Z2f1i
0000020e T _Z2g1i
000001c4 T _Z3fooi
...

所以ld已经根据目标文件之间的依赖关系删除了2.o目标文件。但是没有从 1.o 中删除函数 g1()

最佳答案

也许链接时间优化(即 GCC 4.6 的 -flto 选项)会有帮助?

还有 function attribute __attribute__ ((visibility ("hidden"))) 和/或 __attribute__ ((weak))

进入*.so 共享对象的代码应该用-fPIC

编译

关于c++ - 如何优化共享库的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8021470/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com