我想使用一个开源库。由于我想将我的软件作为二进制包传播,我不希望该库对其他库有依赖关系,因此我需要静态链接依赖关系。
现在,由于该库是开源的并且没有提供二进制文件,因此我自己编译它。该库使用自动工具,我没有找到任何有关如何静态链接依赖项的有用文档。我所做的尝试是使用 --enable-static 调用配置脚本,但这显然只告诉配置编译库的静态版本 - 但我需要的是一个动态库,其中包含它所依赖的所有库。
因此,我需要一种方法来告诉配置静态链接依赖项,或者一种对构建的库进行后处理以包含所有依赖项的方法。谁能告诉我该怎么做?
哦,如果重要的话:我使用的是 64 位 Snow Leopard。
最佳答案
最近我自己也走上了这条路,不幸的是,我发现静态库实际上并不是这样工作的。
当您生成静态可执行二进制文件时,链接器会查看它需要的所有函数,然后查看提供的库列表并提取您需要的每个函数的代码。
当您生成静态库时,您没有进行任何链接,因此所有编译后的代码都会被压缩(实际上它使用 ar
但功能上它与 zip 相同)到.a
静态库。 (“a”代表“archive”。)因为没有链接阶段,所以没有任何东西可以检查库使用哪个函数调用。它只是有一堆“ Unresolved external 问题”,稍后会解决。
这意味着当链接二进制文件时,您需要为您需要的所有函数提供代码(库) - 您自己的代码使用的函数,以及您的所有库使用的函数需要。
我完全明白为什么你想要生成一个包含所有依赖项的库,但是据我所知,它并不是那样工作的。这就是为什么有像 pkg-config
这样的程序,您可以使用它来通知您的(静态或动态)库的用户他们需要链接哪些依赖库才能使用您的库。
最后,请确保检查要链接的任何库的许可证。仅仅因为一个库是开源的,并不意味着您可以不必链接到它。如果它是 GPL 库,那么通过链接到它,您同意在 GPL 下发布您自己的源代码,但您可能不希望这样做。
关于autotools - 如何编译具有静态链接依赖项的自动工具项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2889498/