4

我在我的 C 应用程序中使用 GSL 库的一些功能。这个库很大,有很多功能和设施,我只想要其中的几个。我的问题是我想在一个小型嵌入式系统上使用我的应用程序,而使用这个大型库会使我编译的应用程序变得如此之大。

是否有任何工具可以从如此大的库中提取特定的函数和文件子集?

谢谢大家,

4

3 回答 3

5

是否有任何工具可以从如此大的库中提取特定的函数和文件子集?

是的 - 这就是链接器已经做的事情。

如果单个目标代码文件,库是一个集合。链接器将仅链接那些实际解析代码中的引用所必需的目标文件。只要库设计者使库足够细化(理想情况下,每个目标文件一个公共函数),那么您链接的应用程序代码将与库的大小完全无关,仅与您明确引用的代码的总和有关。

所以我的建议是先构建代码,然后看看你是否真的有问题——很有可能你没有。请记住,您的应用程序可能已经链接了标准 C 库,而这本身并不会使您的应用程序具有整个库的大小!

链接器将能够输出一个 MAP 文件,该文件将详细说明链接的目标代码以及其中的函数和数据对象。您将能够确定链接的效率 - 请记住,尽管您调用的函数很可能会调用您自己未明确引用的库中的其他函数。您的链接器还可以输出详细说明此类依赖关系的交叉引用表。

于 2012-12-16T09:21:26.023 回答
2

您实际上可以使用 mklibs:https ://launchpad.net/mklibs

它能够基于一组取决于该库的可执行文件剥离共享库中未使用的部分。

您甚至不必拥有库的代码。

于 2012-12-20T14:49:55.787 回答
0

如果您可以修改 GLS 库,您可以尝试制作一个精简版本。

最好的方法是使用类似工具生成调用者/被调用者图doxygen,而不是只选择使用和需要的东西。可能您也可能会忽略一些依赖项(例如日志记录、管理状态、您不需要的选项)。

然而,这种方法将需要大量的工作。但是,如果您使用的是小型嵌入式系统,那么“精简版”可能没有那么多代码行,因此挑选樱桃可能是合理的。

于 2012-12-15T18:50:34.813 回答