如何将库静态链接到另一个库,并解析所有符号

时间:2017-11-21 09:30:37

标签: gcc static-libraries

我在C头文件和基于expat库的源文件中编写了一些XML解析实用程序函数。 为此,我已将源文件编译为静态库,其中expat静态链接到它。

只有当我将实用程序库和expat与我的应用程序静态链接时,我才能使用生成的xml实用程序库中的函数和我的应用程序。我认为我应该能够使用静态链接我的实用程序库来构建我的应用程序,而无需再次将expat与应用程序可执行文件静态链接。仅将我的应用程序与实用程序库链接会为expat提供未定义的符号错误。

有人可以指导我,我错过了什么?我正在使用gcc编译器。

...谢谢

1 个答案:

答案 0 :(得分:1)

  

"我已将源文件编译为静态库,其中expat与其静态链接。"

我很难过你。链接器不生成静态库;没有链接,所以没有任何东西可以链接到它。 静态库只不过是ar archive format中的一包目标文件。 当您链接链接器生成 的内容时 - 即程序或共享库 - 你可以向链接器提供这样的包。它会查看包中,只取出它需要的目标文件 进行链接并将他们链接到目标。这个包让你免去困难 需要确切知道链接器中需要哪些目标文件,但是包本身对链接没有任何贡献。

<强>后来

  

如何在我的实用程序库中包含expat静态库,这样我只需要将我的可执行文件链接到一个静态库。我不想提取两个档案并将目标文件合并在一起。

没有其他方法可以合并两个ar档案。

你对链接libexpat的抵制令人费解,没有进一步的背景。它是可用的 通过任何发行版的包管理器。您已经建立了一个依赖libexpat的库。链接您的客户 图书馆还需要链接libexpat。这是一种完全常规的依赖 你应该简单地记录下来 - 如果你打包你的图书馆 - 包括 在包依赖项中。几乎无一例外,当我们编写新的库时,我们正在扩充 库已经可供我们的目标用户使用。如果每个库静态 合并了所有自己的依赖项,然后它们都将是一个大小 操作系统,没有实际用途。