【发布时间】:2010-09-06 00:02:41
【问题描述】:
我已经厌倦了在我的项目中添加十个链接库,或者需要其中八个来使用我自己的。我想采用现有的库,如 libpng.a、libz.a、libjpeg.a,并将它们组合成一个 .a 库。那可能吗?合并 .lib 库怎么样?
【问题讨论】:
我已经厌倦了在我的项目中添加十个链接库,或者需要其中八个来使用我自己的。我想采用现有的库,如 libpng.a、libz.a、libjpeg.a,并将它们组合成一个 .a 库。那可能吗?合并 .lib 库怎么样?
【问题讨论】:
在 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
在 Windows 上,使用 MSVC 工具链:
lib.exe /OUT:libab.lib liba.lib libb.lib
【讨论】:
我不确定如何将它们物理地组合到一个文件中,但是您可以使用某种抽象并只包含一个“AllMyLibs.a/h”,而该“AllMyLibs.a/h”又包含您想要的所有内容。你也可以把它放在你的编译器搜索库的位置,所以它适用于任何项目。
附: - 出于好奇,您为什么不喜欢包含单个库?
【讨论】:
在类 Unix 系统上,ld 和 ar 实用程序可以做到这一点。查看 http://en.wikipedia.org/wiki/Ar_(Unix) 或在任何 linux 机器上或通过 google 查找手册页,例如“unix man ar”。
请注意,链接到共享(动态)库可能会更好。这会给您的可执行文件添加一个依赖项,但会显着减小其大小,尤其是在您编写图形应用程序时。
【讨论】:
将多个第三方库合并为一个可能会给您带来更多问题 - 例如,如果其中两个库定义了您的程序不使用的公共符号。现在,您必须在组合库之前提取公共符号的所有(或唯一一个)实例。
【讨论】:
也许我理解错了,但是如果最终用户代码直接调用它们,您是否只需要发送这些库?如果对 Jpeg 方法等的所有访问都来自您的静态库中的代码,那么只需将这些库链接到您的库中。
即
----------------
| 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:我可以获得艺术家徽章吗? :)
【讨论】:
glib(也是一个静态库)。但是 glib 中的任何内容都没有包含在我的库文件中,这些调用只是未解决。如果您尝试链接到我的库而不链接到glib,这些未解决的调用会导致链接器失败。我可以使用ar 将glib 和我的库打包成一个,但这几乎可以肯定是个坏主意(最终会导致某人重复定义),并且会使我的库变得庞大。
你可以从每个库中提取目标文件
ar x <library name>
然后将它们全部合并到一个新的库中
ar cs <new library name> <list each extracted object file>
【讨论】:
sh4-linux-ar r <existinglib.a> *.o 将其他符号附加到existinglib.a