How to create a self contained GTK+ Application for Linux



The majority of our clients are using custom Linux Distributions and they are
using older versions of GTK+.  Our application depends on features available in
GTK+ >= 2.10 so, I need to figure out how to distribute the application with all
of its dependencies.  

So, I used ldd to determine all of the dependencies.  The output is listed below.

->ldd interwrite-learning-systray
        linux-gate.so.1 =>  (0xffffe000)
        libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb7c49000)
        libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb7bc3000)
        libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0xb7ba7000)
        libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0xb7b90000)
        libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7b69000)
        libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0xb7b61000)
        libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb7b36000)
        libXext.so.6 => /usr/lib/libXext.so.6 (0xb7b28000)
        libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb7b1f000)
        libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0xb7b1c000)
        libXi.so.6 => /usr/lib/libXi.so.6 (0xb7b14000)
        libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0xb7b0e000)
        libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0xb7b05000)
        libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb7b00000)
        libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0xb7ac1000)
        libcairo.so.2 => /usr/lib/libcairo.so.2 (0xb7a51000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0xb7960000)
        libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb7926000)
        libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb7923000)
        libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb791f000)
        libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb7919000)
        librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7910000)
        libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb787b000)
        libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7864000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7723000)
        /lib/ld-linux.so.2 (0xb7fb1000)
        libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0xb76f7000)
        libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb768c000)
        libz.so.1 => /usr/lib/libz.so.1 (0xb7678000)
        libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb7658000)
        libXau.so.6 => /usr/lib/libXau.so.6 (0xb7655000)
        libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb7631000)
        libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb762c000)

So, I copied all of the shared libraries into a sub directory of the application
directory called "lib/" for testing.  I then used the following commands.

->export LD_LIBRARY_PATH=../lib
->./interwrite-learning-systray

Everything runs okay on my system with GTK+ 2.10
I then ran ldd again to see if my application was linked against the libraries
that I'm providing in the application directory and sure enough, it is.  The
output is below.

->ldd interwrite-learning-systray
        linux-gate.so.1 =>  (0xffffe000)
        libgtk-x11-2.0.so.0 => ../lib/libgtk-x11-2.0.so.0 (0xb7c0d000)
        libgdk-x11-2.0.so.0 => ../lib/libgdk-x11-2.0.so.0 (0xb7b87000)
        libatk-1.0.so.0 => ../lib/libatk-1.0.so.0 (0xb7b6b000)
        libgdk_pixbuf-2.0.so.0 => ../lib/libgdk_pixbuf-2.0.so.0 (0xb7b54000)
        libm.so.6 => ../lib/libm.so.6 (0xb7b2d000)
        libpangocairo-1.0.so.0 => ../lib/libpangocairo-1.0.so.0 (0xb7b25000)
        libfontconfig.so.1 => ../lib/libfontconfig.so.1 (0xb7afa000)
        libXext.so.6 => ../lib/libXext.so.6 (0xb7aeb000)
        libXrender.so.1 => ../lib/libXrender.so.1 (0xb7ae3000)
        libXinerama.so.1 => ../lib/libXinerama.so.1 (0xb7ae0000)
        libXi.so.6 => ../lib/libXi.so.6 (0xb7ad8000)
        libXrandr.so.2 => ../lib/libXrandr.so.2 (0xb7ad2000)
        libXcursor.so.1 => ../lib/libXcursor.so.1 (0xb7ac8000)
        libXfixes.so.3 => ../lib/libXfixes.so.3 (0xb7ac3000)
        libpango-1.0.so.0 => ../lib/libpango-1.0.so.0 (0xb7a85000)
        libcairo.so.2 => ../lib/libcairo.so.2 (0xb7a15000)
        libX11.so.6 => ../lib/libX11.so.6 (0xb7924000)
        libgobject-2.0.so.0 => ../lib/libgobject-2.0.so.0 (0xb78e9000)
        libgmodule-2.0.so.0 => ../lib/libgmodule-2.0.so.0 (0xb78e6000)
        libdl.so.2 => ../lib/libdl.so.2 (0xb78e2000)
        libgthread-2.0.so.0 => ../lib/libgthread-2.0.so.0 (0xb78dd000)
        librt.so.1 => ../lib/librt.so.1 (0xb78d4000)
        libglib-2.0.so.0 => ../lib/libglib-2.0.so.0 (0xb783e000)
        libpthread.so.0 => ../lib/libpthread.so.0 (0xb7827000)
        libc.so.6 => ../lib/libc.so.6 (0xb76e6000)
        /lib/ld-linux.so.2 (0xb7f67000)
        libpangoft2-1.0.so.0 => ../lib/libpangoft2-1.0.so.0 (0xb76bb000)
        libfreetype.so.6 => ../lib/libfreetype.so.6 (0xb764f000)
        libz.so.1 => ../lib/libz.so.1 (0xb763b000)
        libexpat.so.1 => ../lib/libexpat.so.1 (0xb761b000)
        libXau.so.6 => ../lib/libXau.so.6 (0xb7618000)
        libpng12.so.0 => ../lib/libpng12.so.0 (0xb75f4000)
        libXdmcp.so.6 => ../lib/libXdmcp.so.6 (0xb75ef000)

So, according the ldd output above, it should work. So, I copied the application
over to a test system using an older version of GTK+ and executed the following
commands.

->export LD_LIBRARY_PATH=../lib
->./interwrite-learning-systray

And I get a segmentation fault.  I then tried ldd and gdb and I get an instant
segmentation fault.  If I unset the LD_LIBRARY_PATH variable and then try ldd
and gdb, they work but the application fails because it's linking against older
libraries.  

Any ideas would be greatly appreciated.






[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]