4

我想使用一个开源库。由于我想将我的软件作为二进制包传播,我不希望库依赖于其他库,所以我需要静态链接依赖关系。

现在由于库是开源的并且没有提供二进制文件,我自己编译它。该库使用自动工具,我没有找到任何关于如何静态链接依赖项的有用文档。我所做的尝试是使用 --enable-static 调用配置脚本,但这显然只告诉 configure 编译库的静态版本 - 但我需要的是一个包含它所依赖的所有库的动态库。

因此,我需要一种方法来告诉 configure 静态链接依赖项,或者一种方法来对构建的库进行后处理以包含所有依赖项。谁能告诉我该怎么做?

哦,如果重要的话:我使用的是 64 位 Snow Leopard。

4

2 回答 2

3

如果您获得库的.a文件,您可以尝试在项目的 Makefile.am 中添加以下内容。

yourproject_LDADD =  libxxx.a
于 2012-04-25T07:24:24.590 回答
2

最近我自己走上了这条路,我发现不幸的是静态库实际上并不是这样工作的。

当您生成静态可执行二进制文件时,链接器会查看它需要的所有函数,然后查看提供的库列表并为您需要的每个函数提取代码。

当你生成一个静态库时,你没有做任何链接,所以你所有的编译代码都被压缩到一个静态库中(实际上它使用ar但在功能上它与 zip 相同) 。.a(“a”代表“归档”。)因为没有链接阶段,所以没有任何东西可以检查库使用的函数调用。它只是有一堆“未解决的外部因素”,稍后会解决。

这意味着当需要链接二进制文件时,您需要为您需要的所有函数提供代码(库)——您自己的代码使用的函数以及您需要的所有库使用的函数

我完全可以理解为什么您要生成一个包含所有依赖项的库,但是据我所知,它不是那样工作的。这就是为什么有类似的程序pkg-config,您可以使用这些程序来通知您的(静态或动态)库的用户,他们需要链接哪些依赖库才能使用您的库。

最后,确保检查要链接的任何库的许可证。仅仅因为库是开源的,并不意味着您可以通过链接摆脱它。如果它是一个 GPL 库,那么通过链接到它,您同意在 GPL 下发布您自己的源代码,您可能不想这样做。

于 2017-10-14T08:31:37.103 回答