Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Dec 2006 09:37:01 -0600
From:      Dan Nelson <dnelson@allantgroup.com>
To:        mal content <artifact.one@googlemail.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Linking static libraries with '-l'
Message-ID:  <20061220153700.GD41207@dan.emsphone.com>
In-Reply-To: <8e96a0b90612200301l467b2688j157071f205685e7@mail.gmail.com>
References:  <8e96a0b90612200301l467b2688j157071f205685e7@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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@allantgroup.com



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20061220153700.GD41207>