Nikhil
Nikhil

Reputation: 2318

How to use libtool to create a static library from a bunch of static libraries

I have around 80 static libraries. I would like to create one static library from that.

This answer didn't work for me since I get the following error:

libtool: unrecognized option `-static'

I am also confused as to which mode it needs to be done in. Is it "link" or "install" Since there 20 odd libraries, can I also use "*" to specify all?

I didn't find any information in document expect this which doesn't really answer my question.

FYI..These are the modes:

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

Upvotes: 10

Views: 11713

Answers (3)

ldav1s
ldav1s

Reputation: 16305

The first linked answer is about the Mac OS libtool, not GNU libtool.

The second link actually might work (shown here wrapped with Makefile variables), if you don't mind writing an install hook:

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

The libtool "link" mode seems very fussy with respect to static libs. I was able to do it but it gave me warnings -- one for each static library, which would be a huge cascade for you.

It might be easier to bypass libtool in this case, though. This will work with 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) $@

If this must be portable, something like this will work:

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) $@

Upvotes: 2

laindir
laindir

Reputation: 1710

I'm probably naively ignoring some consequence, but couldn't you just treat the files directly as archives?

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

Of course, you'll need some kind of renaming scheme if any of the .o files are the same. Probably something like libname_objectname.o.

Upvotes: 7

Groleo
Groleo

Reputation: 616

libtool looks at the parameters of gcc, so you should have something like below

$ 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

Upvotes: 1

Related Questions