On Wed, May 23, 2012 at 8:29 AM, Barrett, Brian W <bwba...@sandia.gov>wrote:
> >I should add the caveat that they are need when linking statically, but > >not when using shared libraries. > > 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} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: cairo Description: Multi-platform 2D graphics library Version: 1.12.2 Requires.private: gobject-2.0 glib-2.0 pixman-1 >= 0.22.0 fontconfig >= 2.2.95 freetype2 >= 9.7.3 libpng xcb-shm xcb >= 1.6 xcb-render >= 1.6 xrender >= 0.6 x11 Libs: -L${libdir} -lcairo Libs.private: -lz -lz Cflags: -I${includedir}/cairo $ 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 $ ldd /usr/lib/libcairo.so linux-vdso.so.1 => (0x00007fff741ff000) libpthread.so.0 => /lib/libpthread.so.0 (0x00007f135eac7000) libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0x00007f135e83f000) libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007f135e608000) libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007f135e369000) libpng15.so.15 => /usr/lib/libpng15.so.15 (0x00007f135e13c000) libxcb-shm.so.0 => /usr/lib/libxcb-shm.so.0 (0x00007f135df39000) libxcb-render.so.0 => /usr/lib/libxcb-render.so.0 (0x00007f135dd30000) libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f135db12000) libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00007f135d906000) libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f135d5cc000) libz.so.1 => /usr/lib/libz.so.1 (0x00007f135d3b6000) librt.so.1 => /lib/librt.so.1 (0x00007f135d1ad000) libm.so.6 => /lib/libm.so.6 (0x00007f135ceb8000) libc.so.6 => /lib/libc.so.6 (0x00007f135cb17000) /lib/ld-linux-x86-64.so.2 (0x00007f135f012000) libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007f135c906000) libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f135c6dc000) libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f135c4d8000) libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f135c2d1000) libdl.so.2 => /lib/libdl.so.2 (0x00007f135c0cd000) 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. (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.)