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

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

问题描述:

我厌倦了将10个链接库添加到我的项目中,或者需要其中8个使用我自己的链接库。我想使用libpng.a,libz.a,libjpeg.a等现有库,并将它们合并成一个.a库。那可能吗?如何结合.lib库?如何将几个C/C++库合并为一个?

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

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

+0

为什么图形应用程序中的图像尺寸越小越好? – bigD 2013-12-29 19:15:23

+1

较小的图像尺寸通常更好。图形库(xlib等)往往非常大,所以如果静态链接,可以制作非常大的可执行文件。 – Avner 2013-12-30 06:28:30

+0

哦,所以你的意思是GUI应用程序。我以为你指的是3D引擎中的图形与GPU着色器和东西... – bigD 2014-01-01 10:43:25

我不知道如何将它们物理地结合成一个文件,但是您可以使用一种排序的抽象,并且只包含一个“AllMyLibs.a/h”,然后包含您想要的所有内容。你也可以把它放到你的编译器搜索库的位置,所以它可以用于任何项目。

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

您可以用

ar x <library name> 

提取每个库的目标文件,然后将它们全部用

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

也许我误解,但只有你不合并成一个新的图书馆如果最终用户代码直接调用它们,必须运送库文件?如果所有对Jpeg方法等的访问都来自您的静态库中的代码,那么只需将这些库链接到您的lib中。

I.e.

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

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

在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