Search code examples
c++automakelibtool

What is the difference between LDADD and LIBADD?


I'm trying to setup an automake project that uses a mix of libtool libraries and exectuables, and I'm having a hard time grokking the automake documentation, esp. as relates to telling the compiler to link against.

So can someone explain the differences between LDADD and LIBADD?

Things like:

  • when is one used over the other,
  • which one takes -lname_of_library style values vs. direct filenames, etc.

Whenever I try to read the relevant documentation, it seems like it assumes that I know things that I don't.


Solution

  • Use the LIBADD primary for libraries, and LDADD for executables. If you were building a libtool library libfoo.la, that depended on another library libbar.la, you would use:

    libfoo_la_LIBADD = libbar.la
    

    If you had other non-libtool libraries, you would also add these with -L and -l options:

    libfoo_la_LIBADD = libbar.la -L/opt/local/lib -lpng
    

    Typically, you would use the configure script to find these extra libraries, and use AC_SUBST to pass them with:

    libfoo_la_LIBADD = libbar.la $(EXTRA_FOO_LIBS)
    

    For a program, just use LDADD :

    myprog_LDADD = libfoo.la # links libfoo, libbar, and libpng to myprog.
    

    Sometimes the boundaries are a bit vague. $(EXTRA_FOO_LIBS) could have been added to myprog_LDADD. Adding dependencies to a libtool (.la) library, and using libtool do all the platform-specific linker magic, is usually the best approach. It keeps all the linker metadata in the one place.