代码之家  ›  专栏  ›  技术社区  ›  Jon Cage

如何将多个C/C++库组合成一个?

  •  34
  • Jon Cage  · 技术社区  · 18 年前

    我厌倦了在我的项目中添加十个链接库,或者要求其中八个使用我自己的链接库。我想使用现有的库,如libpng.a、libz.a、libjpeg.a,并将它们组合成一个.a库。可能吗?合并.lib库怎么样?

    6 回复  |  直到 18 年前
        1
  •  26
  •   Judge Maygarden    18 年前

    您可以使用以下命令从每个库中提取对象文件:

    ar x <library name>
    

    然后将它们合并到一个新的库中

    ar cs <new library name> <list each extracted object file>
    
        2
  •  9
  •   Adam Bellaire    17 年前

    在类Unix系统上,ld和ar实用程序可以做到这一点。退房 http://en.wikipedia.org/wiki/Ar_(Unix) 或者在任何linux机器上或通过google查找手册页,例如“unix man ar”。

    请注意,您最好链接到共享(动态)库。这会给可执行文件添加依赖项,但会大大减小其大小,尤其是在编写图形应用程序时。

        3
  •  7
  •   Heefan    9 年前

    ar -M <<EOM
        CREATE libab.a
        ADDLIB liba.a
        ADDLIB libb.a
        SAVE
        END
    EOM
    ranlib libab.a
    

    或者如果你能保持 liba.a 和 libb.a

    ar crsT libab.a liba.a libb.a
    

    在Windows上,使用MSVC工具链:

    lib.exe /OUT:libab.lib liba.lib libb.lib
    
        4
  •  0
  •   Greg Whitfield    18 年前

    也许我误解了,但是如果最终用户代码直接调用LIB,您不需要只发送LIB吗?如果所有对Jpeg方法等的访问都来自静态库中的代码,那么只需将库链接到库中即可。

    即。

    ----------------
    | End-user exe |
    ----------------
          |
          | makes calls to
          |
          v
     --------------------
     | Your static lib.a | 
     --------------------
             | makes calls to and links
             v
         ------------------------------------ .....
         |                    |         |
      -------------    -------- ---------- 
      | libjpeg.a |    |libz.a| |libpng.a|
      -------------    -------- ----------
    

    例如,如果应用程序代码有调用libz.a的合法需要,那么如上所述,这将是使用动态模块的情况。

        5
  •  0
  •   Adam Tyszecki Ed.    9 年前

    我不知道如何将它们物理地合并到一个文件中,但是您可以使用某种抽象,只包含一个“AllMyLibs.a/h”,它反过来包含您想要的所有内容。您还可以将它放在编译器搜索库的位置,这样它就可以用于任何项目。

    顺便问一下,出于好奇,你为什么不喜欢包含单张LIB?

        6
  •  -2
  •   tuxedo    18 年前

    将多个第三方库合并为一个库可能会给您带来更多问题——例如,如果其中两个库定义了一个程序不使用的公共符号。现在,您必须在合并库之前提取公共符号的所有(或除一个之外的所有)实例。