8

我有一组来自第三方的绝对庞大的 .a 文件。我有自己的库,它只调用这组库中的 5 或 6 个函数。我想生成一个小得多的 .a 文件,其中包含我的代码及其在外部库中的(少量)依赖项。

具体来说:

我有的

  1. 外部.h

    int foo();
    int bar();
    
  2. libexternal.a

    0000000000000000 T foo()
    0000000000000010 T bar()
    
  3. 图书馆.c

    #include "external.h"
    int foo_wrapper() { return foo(); }
    
  4. 图书馆.h

    int foo_wrapper();
    

我想要的是

我想创建一个文件libmylibrary.a,其中包含符号 for foo_wrapper、其依赖项foo以及内部调用的任何内容foo,但不是bar(实际上代表了数千个函数)。这样,人们可以包含我的库,而无需包含external.h或链接libexternal.a. 我不愿意手动列出foo,因为实际上有一大堆功能。

可以做到吗?

更多详情

我愿意列出我需要的符号。例如,我可以foo_wrapper在命令行上指定。但我也不能foo在命令行上指定,以及它调用的任何函数。我可以指定的原因foo_wrapper是它允许我编写一个名为callEverything()的函数,它只调用我想要提供的所有函数,然后将该符号放在命令行上。

4

2 回答 2

4

就像 KevinDTimm 所说:您可以使用“ar”编辑您的 .a 文件,以提取其中的所有目标文件并将必要的目标文件添加回 .a 存档。

该库的作者可以将他的所有函数放入单个 .c 文件或多个文件中。每个 .c 文件产生一个目标文件。

我认为您没有机会只获取目标文件的一部分,您需要全部或什么都不需要。在链接时,将 .obj 文件再次分离到其函数中为时已晚:直接嵌入的地址和函数调用太多。

此外,您的最终程序将包含“归档”到链接的 .a 静态库中的 obj 文件的子集。但是每个单独的 obj 文件要么完全在你的最终可执行文件中,要么根本不存在!

于 2013-08-06T21:09:42.553 回答
0

您需要的是ar*nix 的存档程序;

满足您的所有需求,请参见此处(或只需键入man ar

不过,简短的回答是,您正在寻找“t”选项来查看,“x”选项用于从库中提取对象,“r”选项用于添加它们。

请注意,可能(将)存在大量相互依赖关系,需要相当长的时间才能确定。

于 2012-12-18T22:25:32.687 回答