当前位置:首页> 正文

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

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

How to combine several C/C++ libraries into one?

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


您可以使用以下命令从每个库中提取目标文件

1
ar x <library name>

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

1
ar cs <new library name> <list each extracted object file>

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

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


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

1
2
3
4
5
6
7
8
ar -M <<EOM
    CREATE libab.a
    ADDLIB liba.a
    ADDLIB libb.a
    SAVE
    END
EOM
ranlib libab.a

或者,如果可以保留liba.alibb.a的存在,请执行以下操作:

1
ar crsT libab.a liba.a libb.a

在Windows上,使用MSVC工具链:

1
lib.exe /OUT:libab.lib liba.lib libb.lib

也许是我误会了,但是如果最终用户代码直接调用它们,您是否不必只运送这些库呢?如果对Jpeg方法等的所有访问均来自静态库中的代码,则只需将这些库链接到您的库中即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
----------------
| 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:我会获得艺术家徽章吗? :)


我不确定如何将它们物理地组合成一个文件,但是您可以采用某种抽象,只包含一个" AllMyLibs.a / h",而该文件又包含了您想要的所有内容。您也可以将其放置在编译器搜索库的位置,因此它适用于任何项目。

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


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


展开全文阅读

相关内容