【问题标题】:How can I compile an autotools project with statically linked dependancies?如何编译具有静态链接依赖项的 autotools 项目?
【发布时间】:2010-05-22 19:34:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: autotools static-linking shared-libraries


    【解决方案1】:

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

    yourproject_LDADD =  libxxx.a
    

    【讨论】:

    • 感谢您挖掘这个老问题,但这不是一个真正的答案。我真的想要一个包含库及其所有依赖项的 dll。另外,我自己不使用自动工具。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      相关资源
      最近更新 更多