linking problems with several static libraries
Orna Agmon Ben-Yehuda
ladypine at gmail.com
Thu Jul 11 06:29:57 IDT 2013
On Thu, Jul 11, 2013 at 1:39 AM, Oron Peled <oron at actcom.co.il> wrote:
>
> On Wednesday 10 July 2013 21:31:51 Diego Iastrubni wrote:
> > I have been figthing this nice problem at work, which I would like
> someone
> > to help me. Basically, I have several static libs (liba... libk) which I
> > need to link to my program.
> >
> > My program needs liba, which in turn needs libb.. which in turn needs
> libk.
> > The last libk needs symbols from liba.. and this is where it gets funky.
> > While linking g++ complains that symbols are missing ... and from ar+nm I
> > see that those symbols are avarilable on liba.
>
> * Omer Zak correctly replied that this circular dependency represent
> bad design of the libraries authors.
>
> * But don't despair yet... see below.
>
> > My solution was to
> >
> > g++ -o blabla $(OBJS) liba.a libb.a l...libk.a liba.a
> >
> > I know that using -L -l does not work as well, at I do need to link
> liba.a
> > twice.
>
> * It has nothing to do with '-L' which just adds directories to the search
> path
>
> * It's because the linker in Linux (and all Unix systems I've encountered)
> is
> a single pass one.
>
> * So in general the linking *order* matters -- and circular dependency
> suck.
>
> * But... there are several workarounds for such brain-dead situations.
>
> * Workaround 1:
> - List libraries multiple times, like you did
> - It does exactly what you want
> - But if the dependency graph is more complex... you'd have to
> work harder to find the correct repetitions and order :-(
>
> * Workaround 2:
> - Pass the '--whole-archive' option to 'ld'
> If you link via gcc, just tell it to pass this option to the linker
> via '-Wl' option:
> '-Wl,--whole-archive'
>
> - You don't need to think at all about all these cycles, but....
>
> - The complete set of libraries gets into your executable (even
> unused data and code) -- so you typically generate very big
> executable (yes, doing things the dumb way has its price).
>
>
Continuing this line of thought, you could create (once) one big static
archive from all of the smaller ones with ar. Then you will only be
linking each time with one thing. You can use ar to do that on the basis of
the static libraries, no need to compile everything together. Then you will
link with it and create an executable which is exactly the right size.
> * Workaround 3:
> - This is a "partial" workaround 2 solution.
>
> - Let's say only a subset of the libraries has this cyclic
> dependency problem
>
> - Than you can use the linker '--start-group', '--end-group' options:
> ld .... libx.a liby.a --start-group libbad1.a libbad2.a --end-group
> libz.a
>
> Or, let the programmers deal with the results of their bad design and
> reorganize the code in the libraries -- after all a library should contain
> related and well defined functionality -- the cycles just shows that
> somebody just threw pieces of code to different libraries.
>
> Enjoy,
>
> --
> Oron Peled Voice: +972-4-8228492
> oron at actcom.co.il http://users.actcom.co.il/~oron
> UNIX is user friendly. It's just selective about who its friends are.
>
>
> _______________________________________________
> Linux-il mailing list
> Linux-il at cs.huji.ac.il
> http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il
>
--
Orna Agmon Ben-Yehuda.
http://ladypine.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.cs.huji.ac.il/pipermail/linux-il/attachments/20130711/a4f9fdcf/attachment.html>
More information about the Linux-il
mailing list