【问题标题】:How to use libtool to create a static library from a bunch of static libraries如何使用 libtool 从一堆静态库中创建一个静态库
【发布时间】:2014-09-17 06:00:18
【问题描述】:

我有大约 80 个静态库。我想从中创建一个静态库。

This answer 对我不起作用,因为我收到以下错误:

libtool: unrecognized option `-static'

我也很困惑它需要在哪种模式下完成。是“链接”还是“安装” 既然有20多个库,我也可以用“*”来指定所有吗?

我没有在文档中找到任何信息,除了 this,它并没有真正回答我的问题。

仅供参考..这些是模式:

MODE must be one of the following:

      clean           remove files from the build directory
      compile         compile a source file into a libtool object
      execute         automatically set library path, then run a program
      finish          complete the installation of libtool libraries
      install         install libraries or executables
      link            create a library or an executable
      uninstall       remove libraries from an installed directory

【问题讨论】:

  • 要使用libtool创建一个静态库,所有这80个静态库都必须使用libtool --mode=compile而不是普通的gcc编译。另外,您能否分享一下which libtoolls -l <the path output in the which libtool command> 的输出

标签: c libtool


【解决方案1】:

第一个链接的答案是关于 Mac OS libtool,而不是 GNU libtool。

如果您不介意编写安装钩子,第二个链接实际上可能有效(此处显示为使用 Makefile 变量包装):

$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(AR) cru "$(DESTDIR)$(libdir)/libsponge.a" libfoo.a libbar.a ...

libtool “链接”模式对于静态库来说似乎非常繁琐。我能够做到,但它给了我警告——每个静态库一个,这对你来说将是一个巨大的级联。

不过,在这种情况下绕过libtool 可能更容易。这将适用于 GNU ar:

lib_LIBRARIES=libsponge.a
libsponge.a : libfoo.a libbar.a ...
        echo "CREATE $@" > libsponge-script
        list='$^'; for p in $$list; do \
            echo "ADDLIB $$p" >> libsponge-script; \
        done
        echo "SAVE" >> libsponge-script
        $(AR) -M < libsponge-script
        $(RANLIB) $@

如果它必须是可移植的,那么这样的东西会起作用:

lib_LIBRARIES=libsponge.a
libsponge.a : libfoo.a libbar.a ...
        $(AR) cru $@
        $(MKDIR_P) tmpar
        list='$^'; for p in $$list; do \
            (cd tmpar; $(AR) x "../$$p"; $(AR) q "../$@" *.o; rm *.o;) \
        done
        rm -rf tmpar
        $(RANLIB) $@

【讨论】:

  • 谢谢,但最后一个解决方案不起作用。即使我运行了ranlib,我也得到“无法读取符号:存档没有索引;运行ranlib 来添加一个”。 ar t linspnge.a 提供了一个库列表,而不是我认为有问题的目标文件
  • 据我所知,您必须先提取 .o 文件,然后从中创建新存档。文档不建议它会自动从输入档案中提取对象。不过我可能错了。
  • @Nikhil,所以您是说您输入的.a 文件之一没有索引?
  • 没有。输出库没有索引。提取时的输出库包含 .a 而不是 .o
  • 抱歉,@Nikhil,我忘记了 ar 在这种情况下不会查看存档。我确实记得 GNU ar 确实有一种晦涩难懂的方式来做你想做的事。也许这对你有用。
【解决方案2】:

我可能天真地忽略了一些后果,但你不能直接把文件当作档案吗?

for i in *.a; ar x $i; done
ar r libfoo.a *.o
ranlib libfoo.a

当然,如果任何.o 文件相同,您将需要某种重命名方案。可能类似于libname_objectname.o

【讨论】:

  • 如果不同的 *.a 库中有重复的 *.o 文件,这将不起作用。它们将被覆盖。
【解决方案3】:

libtool 查看 gcc 的参数,所以你应该有类似下面的东西

$ cat Makefile
all: libone libtwo
        rm *.o
        @libtool --mode=link gcc -all-static -o libcombo.a libone.a libtwo.a

libone: one.c
        @libtool --mode=compile gcc -c one.c -o one.lo
        @libtool --mode=link gcc -static -o libone.a one.lo

libtwo: two.c
        @libtool --mode=compile gcc -c two.c -o two.lo
        @libtool --mode=link gcc -static -o libtwo.a two.lo

clean:
        rm -rf .libs *.lo *.o *.a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 2011-05-17
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多