Linking static libraries with '-l'
Coleman Kane
zombyfork at gmail.com
Wed Dec 20 10:04:47 PST 2006
On 12/20/06, Dan Nelson <dnelson at allantgroup.com> wrote:
>
> In the last episode (Dec 20), mal content said:
> > So, if I want to link to the shared library /usr/local/libxyz.so, I
> > simply add '-lxyz' to my program link commands. But what if I want to
> > link to the equivalent static library?
>
> One method is to pass -Bstatic and -Bdynamic to the linker at
> appropriate places:
>
> ${CC} ${CFLAGS} ${LDFLAGS} -o myprogram myprogram.o -Wl,-Bstatic -lxyz
> -Wl,-Bdynamic
>
> That line will pull in libxyz.a while trying to use shared libraries
> for everything else. The drawbacks are: 1) if for some reason you want
> to link that binary statically, you can't just add a LDFLAGS+=-static
> to the Makefile; you have to remove all instances of -Wl,-Bdynamic;
> 2) it's not a standard option (-Wl and -B are supported by Solaris and
> GNU cc and ld, but not AIX), so it's no more portable than determining
> the static library's filename and linking to it directly.
>
> > I've not tried it, but I think this might work:
> >
> > /usr/local/lib/libxyz.so
> > /usr/local/lib-static/libxyz.a
> >
> > That way, a program should be able to specify:
> >
> > cc -o myprog myprog.o -L/usr/local/lib -lxyz.so -L/usr/local/lib-static
> -labc
> >
> > ...and get the dynamic 'libxyz.so' and the static 'libabc.a'.
>
> -L adds paths to the end of the search list, so if there's a
> /usr/local/lib/libabc.so, the linker will use that.
>
> --
> Dan Nelson
> dnelson at allantgroup.com
I believe you can also specify ar archives (what static libs really are is
ar(1) archives of .o files with ranlib(1) run across it).
For example.... the following code will be linked to libm.so normally:
#include <stdio.h>
#include <math.h>
int
main(int argc, char **argv) {
double aoi = 12.0;
printf("%f\n", fabs(aoi));
}
If I would like to link it against shared libm (/usr/lib/libm.so):
cc -o mathprog mathprog.c -lm
or simply
cc -o mathprog mathprog.c (since FreeBSD automatically does the -lm in this
case)
If I would like to use the static libm (located at /usr/lib/libm.a):
cc -o mathprog mathprog.c /usr/lib/libm.a
Its not quite as nice as the auto-search behavior, but it allows you to
literally specify a static library on the commandline. I believe there might
be one caveat in the case where another dynamic library dynamically links in
libm.so... mainly an ambiguity of which fabs() is actually called... I am
not familiar with how this would be resolved in this case.
--
Coleman Kane
More information about the freebsd-hackers
mailing list