【问题标题】:Simple libtool alternative?简单的 libtool 替代方案?
【发布时间】:2011-01-23 16:32:22
【问题描述】:

对老式的 Makefile 非常满意,我正在寻找 libtool 的简单替代品。我不想切换到 automake,当我尝试直接使用 libtool 时,我一直遇到问题。最新的一个是“不受支持的硬编码属性”,我厌倦了缺乏完整的文档来告诉我这次出了什么问题......

我只想编译一堆带有正确标志的 .o 文件,然后将它们链接到一个共享库中,这样它就可以在尽可能多的平台上运行。有没有什么东西可以做到这一点,而不是强迫我同时切换所有其他工具?

【问题讨论】:

  • 使用 automake 如何意味着您必须切换所有工具?编写自己的 makefile 意味着您必须手动包含对 automake 自动为您执行的大量内容的支持。当我切换到使用 automake 时,只有一件事发生了变化:我的 150 行 Makefile 变得更有特色,10 行 Makefile.ams。所有其他工具保持不变。

标签: c++ c shared-libraries libtool


【解决方案1】:

我不确定它是否适合您的工作流程,但我建议您查看CMake。它适用于 Windows、Linux 和 Mac,不应强迫您更改任何其他工具。不过,您必须自己判断其适用性。

【讨论】:

  • 我知道 CMake,但这比我想要的要多一点。我不想将我的 Makefile 系统切换到其他东西,我只想要一个我告诉的工具:“给我编译器标志,以便我可以编译这些 n 个文件以在共享库中使用,然后给我命令将它们连接在一起”。
【解决方案2】:

还有jlibtool(跟java无关)。

它是用 C 语言编写的,可以与您的源代码捆绑在一起。

它最初是apache project,但在那里工作的人似乎在 2004 年左右放弃了它。

它由 FreeRADIUS 项目维护者 Alan Dekok 接管,他对代码进行了现代化改造并修复了一些琐碎的问题。我们将它用于 FreeRADIUS 项目 (>= 3.0.0) 以执行所有构建时链接。

【讨论】:

    【解决方案3】:

    鉴于您在评论中对 Milliams 回答的描述,

    我只想要一个告诉我的工具:“给我编译器标志,以便我可以编译这些 n 个文件以在共享库中使用,然后给我命令将它们链接在一起”,

    那么 libtool 可能是最简单的工具。我知道没有其他选择。

    你说得对,使用 libtool 和普通 makefile 的文档几乎不存在,但 libtool 肯定不需要你切换到 automake。跨平台库很难,你必须为它们付出的代价是 libtool。 (或者折扣价可能是 libtool+automake+autoconf 或 CMake 或 Jam。)

    【讨论】:

    • 我害怕这个答案......也许有人知道在 configure.in 中设置 libtool 的推荐方法是什么,而不通过 automake 这样做? (即只使用 autoconf,而不是 automake)。
    【解决方案4】:

    slibtool (dl.midipix.org/slibtool, git://midipix.org/slibtool) 是一个 libtool 插件替代品,用 C 语言编写。单个 slibtool 二进制文件旨在无缝支持原生和交叉构建,并且该实用程序还提供了一些附加功能(.la 文件的安装是可选的,可选的颜色编码注释等)。以下最小的普通 makefile 演示了如何(交叉)使用 slibtool 构建库。

    CC      = cc
    LIBTOOL = slibtool
    DESTDIR = destdir
    
    all:    libfoo.la
    
    a.lo:
        $(LIBTOOL) --mode=compile --tag=CC $(CC) -c a.c
    
    libfoo.la: a.lo
        $(LIBTOOL) --mode=link --tag=CC $(CC) -o libfoo.la -rpath /lib
    
    install: all
        mkdir -p destdir
        $(LIBTOOL) --mode=install cp libfoo.la $(DESTDIR)
    
    # the -rpath argument is required for semantic compatibility with libtool.
    

    原生构建,默认(共享库和静态库)

    $ make
    $ make install
    

    本机构建,仅限共享库

    $ make LIBTOOL=slibtool-shared
    $ make install
    

    原生构建,仅静态库

    $ make LIBTOOL=slibtool-static
    $ make install
    

    交叉构建,默认

    $ make CC=some-target-tuple-gcc
    $ make install
    

    交叉构建,默认,有很多颜色

    $ make LIBTOOL=dlibtool CC=some-target-tuple-gcc
    $ make install
    

    【讨论】:

      猜你喜欢
      • 2012-01-18
      • 2023-03-15
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      相关资源
      最近更新 更多