题
我厌倦了加入十库的链接进入我的项目,或要求的八个他们用我自己的。我想把现有库像libpng.一、libz.一、libjpeg.一,并且将它们合并成一个单一的。图书馆。这可能吗?关于如何组合。lib库?
解决方案
在类Unix系统中,ld和ar公用事业可以做到这一点。检查了 http://en.wikipedia.org/wiki/Ar_(Unix) 或者查找的人网页上的任何linux系统中或通过谷歌,e。g'unix man ar'.
请注意,你可以更好地关联到一个共用(动态)图书馆。这将添加依赖可执行,但将大幅减少其大小,尤其是如果你写一个图形程序。
其他提示
你可以提取的目文件从各个图书馆
ar x <library name>
然后将它们合并成一个新的图书馆
ar cs <new library name> <list each extracted object file>
在Linux或MinGW或Cygwin,GNU工具:
ar -M <<EOM
CREATE libab.a
ADDLIB liba.a
ADDLIB libb.a
SAVE
END
EOM
ranlib libab.a
或者如果你可以保持的存在 liba.a
和 libb.a
:
ar crsT libab.a liba.a libb.a
在窗户,MSVC工具:
lib.exe /OUT:libab.lib liba.lib libb.lib
也许我误解,但是你不仅仅有船舶库,如果最终用户代码呼吁他们直接?如果所有的访问Jpeg方法等是从你的代码,在你的静态图书馆,然后只是链接libs到你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.一,libpng.一等。
如果应用程序的代码中有一个合法需要调libz.例如,然后,将作为上面提到的一种情况下使用动态模块。
PS:我得到一个艺术家徽章吗?:)
我不知道该如何身体上将它们结合成一个单一文件,但是你可以雇用一种抽象的一种仅包括一个单一的"AllMyLibs.a/h",其中又包括一切你想要的。你也可以把这个进入位置的编译器搜索图书馆,使它的工作的任何项目。
P.S. 出于好奇,你为什么不喜欢,包括单libs?
合并几个第三方图书馆变成一个可以创造更多的问题--例如,如果两个图书馆定一个共同的符号,你的节目不会使用。现在你已经有够提取所有(或所有的-但是-一个)的实例常见的象征之前你结合起来的图书馆。