我有一组来自第三方的绝对庞大的.a文件。我有自己的库,仅从这组库中调用5或6个函数。我想产生一个小得多的.a文件,该文件包括我的代码及其在外部库中的(少量)依赖项。
具体来说:
是)我有的
int foo();
int bar();
0000000000000000 T foo()
0000000000000010 T bar()
#include "external.h"
int foo_wrapper() { return foo(); }
int foo_wrapper();
我想要的是
我想创建一个文件
libmylibrary.a
,其中包含foo_wrapper
的符号,其依赖项foo
以及foo
内部调用的任何内容,但不包括bar
(实际上代表数千个函数)。这样,人们可以包括我的图书馆,而不必在external.h
中包括libexternal.a
或链接。我不愿意手动列出foo
,因为实际上有很多功能。能做到吗
更多详情
我愿意列出我需要的符号。因此,例如,我可以在命令行中指定
foo_wrapper
。但是我也不能在命令行上指定foo
以及它调用的任何函数。我可以指定foo_wrapper
的原因是,它允许我编写一个称为callEverything()
的函数,该函数仅调用我要提供的所有函数,然后将该符号放在命令行中。 最佳答案
就像KevinDTimm所说的那样:您可以使用“ar”编辑.a文件,以提取其中的所有目标文件,并将必要的文件添加回.a文件中。
该库的作者可能会将所有功能都放在单个.c文件中或多个文件中。每个.c文件生成一个目标文件。
我认为您没有机会只使用目标文件的一部分,您只需要全部或什么都不需要。在链接时,将.obj文件再次分离到其功能中为时已晚:直接嵌入的地址和函数调用太多。
此外,您的最终程序还将包含obj文件的一个子集,这些子集被“归档”到链接的.a静态库中。但是每个obj文件要么完全在您最终的可执行文件中,要么根本不存在!
关于linux - 从静态库中剥离不需要的符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13942469/