如何使用libtool从一堆静态库中创建静态库

时间:2014-07-25 11:28:40

标签: c libtool

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

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

libtool: unrecognized option `-static'

我也很困惑它需要做哪种模式。是“链接”还是“安装” 由于有20多个库,我还可以用“*”来指定所有的吗?

我没有在文件中找到任何信息this,这些信息并没有真正回答我的问题。

FYI ..这些是模式:

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

3 个答案:

答案 0 :(得分:4)

我可能会天真地忽略某些后果,但你不能直接将文件视为档案吗?

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

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

答案 1 :(得分:1)

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

如果您不介意编写安装挂钩,第二个链接实际上可能会起作用(此处显示为包含Makefile变量):

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

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

但在这种情况下绕过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) $@

答案 2 :(得分:0)

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