我厌倦了将十个链接库添加到我的项目中,或者要求其中八个来使用我的项目。我想将现有的库如libpng.a、libz.a和libjpeg.a合并成一个单独的.a库文件。这是否可能?那么如何合并.lib库呢?
您可以使用以下命令从每个库中提取对象文件:
ar x <library name>
然后将它们全部合并到一个新的库中
ar cs <new library name> <list each extracted object file>
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上,使用Microsoft Visual C++工具链:
lib.exe /OUT:libab.lib liba.lib libb.lib
liba.a
和libb.a
的存在”是什么意思?你能详细说明一下吗? - Peter Mortensen我不确定如何将它们物理上合并为单个文件,但是您可以使用某种抽象来仅包含一个“AllMyLibs.a/h”,其中包含您想要的所有内容。您还可以将其放置在编译器搜索库的位置,以便任何项目都可以使用。
I.e.,
---------------------
| End-user EXE file |
---------------------
|
| 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,例如,那么正如上面提到的,这将是使用动态模块的情况。
glib
(也是一个静态库)。但是我的库文件中没有包含来自 glib 的任何内容,这些调用仅被留作未解决的。如果您尝试链接到我的库而不链接到 glib
,这些未解决的调用会导致链接器失败。我可以使用 ar
将 glib
和我的库打包成一个文件,但这几乎肯定是一个坏主意(最终会为某人导致重复定义),并且会使我的库变得非常庞大。 - brianmearns
sh4-linux-ar r <existinglib.a> *.o
以将其他符号附加到existinglib.a
。 - Edu Felipe