autotools - 如何编译具有静态链接依赖项的自动工具项目?

标签 autotools static-linking shared-libraries

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

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

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

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

最佳答案

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

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

当您生成静态库时,您没有进行任何链接,因此所有编译后的代码都会被压缩(实际上它使用 ar 但功能上它与 zip 相同)到.a 静态库。 (“a”代表“archive”。)因为没有链接阶段,所以没有任何东西可以检查库使用哪个函数调用。它只是有一堆“ Unresolved external 问题”,稍后会解决。

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

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

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

关于autotools - 如何编译具有静态链接依赖项的自动工具项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2889498/

相关文章:

c++ - 链接到链接到我已经链接到的库的库

c - make 使用 autotools 给出 undefined reference 错误,而自定义 Makefile 工作正常

static-linking - 如何使用pkg-config静态链接库

build - Autotools、Cmake 和 Scons 之间有什么区别?

c - 我需要静态库来静态链接吗?

package - 打包库(Debian)时创建符号链接(symbolic link)?

c++ - 没有扩展名的Linux可执行文件的共享库(.so)之间的区别?

适用于 Linux 和 Windows 的 C++ 跨平台动态库

cmake - 如何在cmake项目中使用tclap

c - 如何将单元测试添加到已建立的(自动工具)C 项目中