On May 27, 2012, at 1:52 PM, Jed Brown wrote:

> On Wed, May 23, 2012 at 8:29 AM, Barrett, Brian W <bwba...@sandia.gov> wrote:
> 
> > And therein lies the problem.  We have a number of users who build Open
> > MPI statically and even some who build both static and shared libraries in
> > the same build.  We've never been able to figure out a reasonable way to
> > guess if we need to add -lhwloc or -ldl, so we add them.  It's better to
> > list them and have some redundant dependencies (since you have to have the
> > library anyways) than to not list them and have odd link errors.
> 
> So pkg-config has the --static option for exactly this reason. Let's look at 
> Cairo as an example.
> 
> $ cat /usr/lib/pkgconfig/cairo.pc 
> prefix=/usr
> exec_prefix=${prefix}
> [snip]
> $ pkg-config cairo --libs
> -lcairo
> $ pkg-config cairo --libs --static
> -pthread -lcairo -lgobject-2.0 -lffi -lpixman-1 -lfontconfig -lexpat 
> -lfreetype -lbz2 -lpng15 -lz -lm -lxcb-shm -lxcb-render -lXrender -lglib-2.0 
> -lrt -lpcre -lX11 -lpthread -lxcb -lXau -lXdmcp

We've tossed around ideas such as having the wrappers always assume dynamic 
linking (e.g., only include a minimum of libraries), and then add another 
wrapper option like --wrapper:static (or whatever) to know when to add in all 
the dependent libraries.  Or possibly even look for some popular linker options 
like --static, or some such (which we've tried to avoid, because that can turn 
into a slippery slope), but such switches aren't always necessary for 
MPI-only-static (vs. completely-100%-static) linking.  It gets even fuzzier 
when both libmpi.so and libmpi.a are present.  Which way should we assume?

Another problem is backwards compatibility -- users who are currently 
statically linking will assume the old behavior (of not needing to specify 
anything additional).

> Now I'm not saying that Open MPI should commit to pkg-config instead of 
> wrapper compilers, but the concept of linking differently for static versus 
> shared libraries is something that should be observed.

Fair enough.  But we've never been able to come up with a rational way to do it 
(note that pkg-config has its own problems -- OMPI provides pkg-config files in 
addition to wrapper compilers, but they don't fix everything, either).

We have users who both --enable-static and --enable-shared (meaning: both 
libmpi.so and libmpi.a are present).  And therefore we've come down on the 
conservative side of adding in whatever is necessary for static linking.

> (Over-linking is an ongoing problem with HPC-oriented packages. We are 
> probably all guilty of it, but tools like pkg-config don't handle multiple 
> configurations well and I don't know of a similar system that manages both 
> static/shared and multi-configuration well.)

I suppose, but it does depend on how you define "problem".  The linker will 
ignore any unused libraries -- so it's a problem like lint is a problem.  It's 
annoying, but it doesn't do any harm.

...or are there cases where it actually does something harmful?

-- 
Jeff Squyres
jsquy...@cisco.com
For corporate legal information go to: 
http://www.cisco.com/web/about/doing_business/legal/cri/


Reply via email to