如何将几个C / C ++库合二为一?

时间:2008-08-16 13:46:02

标签: c++ c archive

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

6 个答案:

答案 0 :(得分:23)

您可以使用

从每个库中提取目标文件
ar x <library name>

然后将它们全部合并到一个带有

的新库中
ar cs <new library name> <list each extracted object file>

答案 1 :(得分:8)

在类Unix系统上,ld和ar实用程序可以执行此操作。查看http://en.wikipedia.org/wiki/Ar_(Unix)或在任何linux框或通过谷歌查找手册页,例如'unix man ar'。

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

答案 2 :(得分:3)

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

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

或者,如果您可以保留liba.alibb.a

的存在
ar crsT libab.a liba.a libb.a

在Windows上,使用MSVC工具链:

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

答案 3 :(得分:0)

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

----------------
| 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:我有艺术家徽章吗? :)

答案 4 :(得分:0)

我不确定如何将它们物理地组合到单个文件中,但是您可以使用排序的抽象,只包括一个“AllMyLibs.a / h”,其中包含您想要的所有内容。您也可以将它放入编译器搜索库的位置,这样它就适用于任何项目。

P.S。 - 出于好奇,为什么你不喜欢包括单一的文件?

答案 5 :(得分:-1)

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