Dear all,
we have a large C++ project containing of several modules which each get
compiled into seperate shared libraries. Our directory structure looks
somehow as follows:
---snip---
<src>
<module_1>
<module_2>
<module_3>
<module_4>
....
<module_n>
---snap---
During compilation the shared libraries get placed under
"<src>/<module_X>/.libs".
The resulting binary can be exectuted directly from our build directory.
The output for module "commonbasics" during linking you can see below.
---snip---
/bin/sh ../../libtool --tag=CXX --mode=link g++ -DDEBUG -Wcast-align
-Wundef -Wconversion -fno-builtin -Wnon-virtual-dtor -Wno-long-long -g
-Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings
-D_GNU_SOURCE -I/usr/X11R7/include -fno-exceptions -fno-rtti
-fno-check-new -DQT_THREAD_SUPPORT -fno-exceptions -fno-rtti -version-info
1:0:0 -L/lib/qt-x11-338/lib -L/usr/include/lib -L/usr/lib -o
libCommonBasics.la -rpath /opt/kmt/lib libCommonBasics_la-Base64.lo
libCommonBasics_la-CommonOS.lo libCommonBasics_la-ConfigAccessXML.lo
libCommonBasics_la-ConfigKeyXML.lo libCommonBasics_la-Debug.lo
libCommonBasics_la-global_funcs.lo libCommonBasics_la-Authentication.lo
libCommonBasics_la-LoggingCtrl.lo libCommonBasics_la-LoggingFile.lo
libCommonBasics_la-LoggingService.lo
libCommonBasics_la-moc_ExternalProcess.lo
libCommonBasics_la-ExternalProcess.lo
libCommonBasics_la-LoggingInterface.lo libCommonBasics_la-LoggingRemote.lo
libCommonBasics_la-strhelper.lo libCommonBasics_la-Timeval.lo
libCommonBasics_la-UnitConvert.lo ../../src/commandline/libCommandLine.la
../../src/hash/libHash.la ../../src/uuid/libUUID.la -lqt-mt -lfreetype
libtool: link: g++ -shared -nostdlib
/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/../../../crti.o
/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/crtbeginS.o
.libs/libCommonBasics_la-Base64.o .libs/libCommonBasics_la-CommonOS.o
.libs/libCommonBasics_la-ConfigAccessXML.o
.libs/libCommonBasics_la-ConfigKeyXML.o .libs/libCommonBasics_la-Debug.o
.libs/libCommonBasics_la-global_funcs.o
.libs/libCommonBasics_la-Authentication.o
.libs/libCommonBasics_la-LoggingCtrl.o
.libs/libCommonBasics_la-LoggingFile.o
.libs/libCommonBasics_la-LoggingService.o
.libs/libCommonBasics_la-moc_ExternalProcess.o
.libs/libCommonBasics_la-ExternalProcess.o
.libs/libCommonBasics_la-LoggingInterface.o
.libs/libCommonBasics_la-LoggingRemote.o
.libs/libCommonBasics_la-strhelper.o .libs/libCommonBasics_la-Timeval.o
.libs/libCommonBasics_la-UnitConvert.o -Wl,-rpath
-Wl,/root/KMT/KMT/src/commandline/.libs -Wl,-rpath
-Wl,/root/KMT/KMT/src/hash/.libs -Wl,-rpath
-Wl,/root/KMT/KMT/src/uuid/.libs -L/lib/qt-x11-338/lib -L/usr/include/lib
-L/usr/lib ../../src/commandline/.libs/libCommandLine.so
-L/opt/postgresql/lib -L/usr/X11R7/lib -L//lib
-L/TOOLCHAIN/src.gcc.default.20100331.154012.28770.tut-pc188/gcc-4.4.3/objdir/i686-t2-linux-gnu/libstdc++-v3/src
-L/TOOLCHAIN/src.gcc.default.20100331.154012.28770.tut-pc188/gcc-4.4.3/objdir/i686-t2-linux-gnu/libstdc++-v3/src/.libs
../../src/hash/.libs/libHash.so ../../src/uuid/.libs/libUUID.so
/usr/X11R7/lib/libXfixes.so /usr/lib/libexpat.so /usr/X11R7/lib/libxcb.so
/usr/X11R7/lib/libXau.so /usr/lib/libuuid.so
/lib/qt-x11-338/lib/libqt-mt.so /usr/X11R7/lib/libXrender.so
/usr/X11R7/lib/libXrandr.so /usr/X11R7/lib/libXcursor.so
/usr/X11R7/lib/libXinerama.so /usr/X11R7/lib/libXft.so
/usr/X11R7/lib/libfontconfig.so /usr/X11R7/lib/libXext.so
/usr/X11R7/lib/libX11.so /usr/X11R7/lib/libSM.so /usr/X11R7/lib/libICE.so
-ldl -lpthread /usr/lib/libfreetype.so -lz
-L/usr/lib/gcc/i686-t2-linux-gnu/4.4.3
-L/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/../../../../i686-t2-linux-gnu/lib
-L/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/../../.. /usr/lib/libstdc++.so -lm
-lc -lgcc_s /usr/lib/gcc/i686-t2-linux-gnu/4.4.3/crtendS.o
/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/../../../crtn.o -Wl,-soname
-Wl,libCommonBasics.so.1 -o .libs/libCommonBasics.so.1.0.0
libtool: link: (cd ".libs" && rm -f "libCommonBasics.so.1" && ln -s
"libCommonBasics.so.1.0.0" "libCommonBasics.so.1")
libtool: link: (cd ".libs" && rm -f "libCommonBasics.so" && ln -s
"libCommonBasics.so.1.0.0" "libCommonBasics.so")
libtool: link: ( cd ".libs" && rm -f "libCommonBasics.la" && ln -s
"../libCommonBasics.la" "libCommonBasics.la" )
---snap---
As one can see, absolute paths are compiled into the resulting library for
the RPATH. (/root/KMT/KMT/src/commandline/.libs)
When performing the "make install" step all the libraries and binaries get
installed to our prefix directory "/opt/kmt". This currently takes very
long (~20 minutes) as libtool relinks all libraries. The output for module
"commonbasics" you can see below.
---snip---
-bash-4.1# make install DESTDIR=/
make[1]: Entering directory `/root/KMT/KMT/src/commonbasics'
test -z "/opt/kmt/lib" || ../../admin/install-sh -c -d "//opt/kmt/lib"
/bin/sh ../../libtool --mode=install /usr/bin/install -c
libCommonBasics.la '//opt/kmt/lib'
libtool: install: warning: relinking `libCommonBasics.la'
libtool: install: (cd /root/KMT/KMT/src/commonbasics; /bin/sh
/root/KMT/KMT/libtool --tag CXX --mode=relink g++ -DDEBUG -Wcast-align
-Wundef -Wconversion -fno-builtin -Wnon-virtual-dtor -Wno-long-long -g
-Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings
-D_GNU_SOURCE -I/usr/X11R7/include -fno-exceptions -fno-rtti
-fno-check-new -DQT_THREAD_SUPPORT -fno-exceptions -fno-rtti -version-info
1:0:0 -L/lib/qt-x11-338/lib -L/usr/include/lib -L/usr/lib -o
libCommonBasics.la -rpath /opt/kmt/lib libCommonBasics_la-Base64.lo
libCommonBasics_la-CommonOS.lo libCommonBasics_la-ConfigAccessXML.lo
libCommonBasics_la-ConfigKeyXML.lo libCommonBasics_la-Debug.lo
libCommonBasics_la-global_funcs.lo libCommonBasics_la-Authentication.lo
libCommonBasics_la-LoggingCtrl.lo libCommonBasics_la-LoggingFile.lo
libCommonBasics_la-LoggingService.lo
libCommonBasics_la-moc_ExternalProcess.lo
libCommonBasics_la-ExternalProcess.lo
libCommonBasics_la-LoggingInterface.lo libCommonBasics_la-LoggingRemote.lo
libCommonBasics_la-strhelper.lo libCommonBasics_la-Timeval.lo
libCommonBasics_la-UnitConvert.lo ../../src/commandline/libCommandLine.la
../../src/hash/libHash.la ../../src/uuid/libUUID.la -lqt-mt -lfreetype
-inst-prefix-dir /)
libtool: relink: g++ -shared -nostdlib
/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/../../../crti.o
/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/crtbeginS.o
.libs/libCommonBasics_la-Base64.o .libs/libCommonBasics_la-CommonOS.o
.libs/libCommonBasics_la-ConfigAccessXML.o
.libs/libCommonBasics_la-ConfigKeyXML.o .libs/libCommonBasics_la-Debug.o
.libs/libCommonBasics_la-global_funcs.o
.libs/libCommonBasics_la-Authentication.o
.libs/libCommonBasics_la-LoggingCtrl.o
.libs/libCommonBasics_la-LoggingFile.o
.libs/libCommonBasics_la-LoggingService.o
.libs/libCommonBasics_la-moc_ExternalProcess.o
.libs/libCommonBasics_la-ExternalProcess.o
.libs/libCommonBasics_la-LoggingInterface.o
.libs/libCommonBasics_la-LoggingRemote.o
.libs/libCommonBasics_la-strhelper.o .libs/libCommonBasics_la-Timeval.o
.libs/libCommonBasics_la-UnitConvert.o -L/lib/qt-x11-338/lib
-L/usr/include/lib -L/usr/lib -L//opt/kmt/lib -L/opt/kmt/lib -lCommandLine
-L/opt/postgresql/lib -L/usr/X11R7/lib -L//lib
-L/TOOLCHAIN/src.gcc.default.20100331.154012.28770.tut-pc188/gcc-4.4.3/objdir/i686-t2-linux-gnu/libstdc++-v3/src
-L/TOOLCHAIN/src.gcc.default.20100331.154012.28770.tut-pc188/gcc-4.4.3/objdir/i686-t2-linux-gnu/libstdc++-v3/src/.libs
-lHash -lUUID -L//usr/X11R7/lib -lXfixes -L//usr/lib -lexpat -lxcb -lXau
-luuid -L//lib/qt-x11-338/lib -lqt-mt -lXrender -lXrandr -lXcursor
-lXinerama -lXft -lfontconfig -lXext -lX11 -lSM -lICE -ldl -lpthread
-lfreetype -lz -L/usr/lib/gcc/i686-t2-linux-gnu/4.4.3
-L/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/../../../../i686-t2-linux-gnu/lib
-L/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/../../.. -lstdc++ -lm -lc -lgcc_s
/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/crtendS.o
/usr/lib/gcc/i686-t2-linux-gnu/4.4.3/../../../crtn.o -Wl,-soname
-Wl,libCommonBasics.so.1 -o .libs/libCommonBasics.so.1.0.0
libtool: install: /usr/bin/install -c .libs/libCommonBasics.so.1.0.0T
//opt/kmt/lib/libCommonBasics.so.1.0.0
libtool: install: (cd //opt/kmt/lib && { ln -s -f libCommonBasics.so.1.0.0
libCommonBasics.so.1 || { rm -f libCommonBasics.so.1 && ln -s
libCommonBasics.so.1.0.0 libCommonBasics.so.1; }; })
libtool: install: (cd //opt/kmt/lib && { ln -s -f libCommonBasics.so.1.0.0
libCommonBasics.so || { rm -f libCommonBasics.so && ln -s
libCommonBasics.so.1.0.0 libCommonBasics.so; }; })
libtool: install: /usr/bin/install -c .libs/libCommonBasics.lai
//opt/kmt/lib/libCommonBasics.la
libtool: install: warning: remember to run `libtool --finish /opt/kmt/lib'
make[1]: Nothing to be done for `install-data-am'.
make[1]: Leaving directory `/root/KMT/KMT/src/commonbasics'
---snap---
How can I avoid this additional relinking step during "make install"? I
guess it's because of the absolutes paths which get compiled into the
libraries RPATH during compilation. Actually, we always want to run the
binary from it's install prefix and not out of the build tree. How can I
force libtool to set the correct rpath for the resulting libraries already
during the compilation step so that relinking ist not needed anymore
during "make install".
We are using libtool-2.2.6b and automake-1.11.1. Please feel free to ask
any further information which you might need to figure out the problem.
Thanks for any comments on this,
Markus Franke
"Disclaimer: This message is intended only for the use of the individual
or entity to
which it is addressed and may contain information which is privileged,
confidential, proprietary,
or exempt from disclosure under applicable law. If you are not the
intended recipient or the person
responsible for delivering the message to the intended recipient, you are
strictly prohibited from
disclosing, distributing, copying, or in any way using this message. If
you have received this
communication in error, please notify the sender and destroy and delete
any copies you may have
received."
_______________________________________________
http://lists.gnu.org/mailman/listinfo/libtool