43

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

4

6 回答 6

26

您可以从每个库中提取目标文件

ar x <library name>

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

ar cs <new library name> <list each extracted object file>
于 2008-08-16T16:18:30.823 回答
9

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

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

于 2008-08-16T14:15:23.037 回答
7

在 Linux 或 MinGW 或 Cygwin 上,使用 GNU 工具链:

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

或者,如果您可以保持liba.aand的存在libb.a

ar crsT libab.a liba.a libb.a

在 Windows 上,使用 MSVC 工具链:

lib.exe /OUT:libab.lib liba.lib libb.lib
于 2014-12-28T11:43:54.630 回答
0

我不确定如何将它们物理组合到一个文件中,但是您可以使用某种抽象并只包含一个“AllMyLibs.a/h”,而该“AllMyLibs.a/h”又包含您想要的所有内容。你也可以把它放在你的编译器搜索库的位置,所以它适用于任何项目。

PS - 出于好奇,你为什么不喜欢包含单个库?

于 2008-08-16T14:08:54.733 回答
0

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

IE

----------------
| 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、libpng.a 等,这只是一个问题。

例如,如果应用程序代码有调用 libz.a 的合法需求,那么上面提到的就是使用动态模块的情况。

PS:我可以获得艺术家徽章吗?:)

于 2008-08-22T10:32:09.833 回答
-2

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

于 2008-08-28T02:58:33.463 回答