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

具体来说:

是)我有的

  • external.h
    int foo();
    int bar();
    
  • libexternal.a
    0000000000000000 T foo()
    0000000000000010 T bar()
    
  • mylibrary.c
    #include "external.h"
    int foo_wrapper() { return foo(); }
    
  • mylibrary.h
    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/

    10-15 16:07
    查看更多