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

时间:2010-05-22 19:34:10

标签: autotools static-linking shared-libraries

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

yourproject_LDADD =  libxxx.a

答案 1 :(得分:2)

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

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

当你创建一个静态库时,你没有进行任何链接,因此所有编译的代码都被压缩(实际上它使用ar但功能上它与zip相同)到{{1静态库。 ('a'代表'archive'。)因为没有链接阶段,所以没有任何东西可以检查库使用哪些函数调用。它只是有一堆“未解决的外部”,将在稍后解决。

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

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

最后,请务必检查要与之关联的库的许可。仅仅因为一个库是开源的,它并不意味着你可以逃脱链接。如果它是GPL库,那么通过链接到它,您同意在GPL下发布您自己的源代码,您可能不想这样做。