如何将几个C / C ++库组合成一个库?
时间:2020-03-05 18:40:03 来源:igfitidea点击:
我厌倦了将十个链接库添加到我的项目中,或者要求其中八个使用我自己的链接库。我想使用现有的库,例如libpng.a,libz.a,libjpeg.a,并将它们组合成一个单独的.a库。那可能吗?如何合并.lib库?
解决方案
回答
我不确定如何将它们物理地组合成一个文件,但是我们可以采用某种抽象,只包含一个" AllMyLibs.a / h",而该文件又包含了我们想要的所有内容。我们也可以将其放置在编译器搜索库的位置,因此它适用于任何项目。
P.S.出于好奇,我们为什么不喜欢包含单个库?
回答
在类似Unix的系统上,ld和ar实用程序可以做到这一点。请访问http://en.wikipedia.org/wiki/Ar_(Unix)或者在任何Linux机器上或者通过google查找手册页,例如" unix man ar"。
请注意,链接到共享(动态)库可能会更好。这将为可执行文件增加一个依赖关系,但会大大减小其大小,尤其是在编写图形应用程序时。
回答
我们可以使用以下命令从每个库中提取目标文件:
ar x <library name>
然后将它们全部合并到一个新的库中
ar cs <new library name> <list each extracted object file>
回答
也许是我误会了,但是如果最终用户代码直接调用它们,我们是否不必只运送这些库呢?如果对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:我会获得艺术家徽章吗? :)
回答
将多个第三方库合并到一个库中可能会给我们带来更多问题-例如,如果其中两个库定义了程序不使用的公共符号。现在,在合并库之前,我们必须提取公共符号的所有(或者仅一个)实例。