Hlavní navigace

Programování pod Linuxem pro všechny (7)

Jakub Matys

V dnešním dílu dokončím povídání o libtool. Naučíte se ladit programy vytvořené pomocí libtool, instalovat knihovny a spustitelné programy.

Je celkem samozřejmé, že vámi napsaný program před „vypuštěním“ odladíte. Pokud je program spojen s knihovnami pomocí libtool, bude ladění probíhat nestandardním způsobem. Používáte-li program gdb, nestačí zapsat:

# gdb hell
GNU gdb 2002-04-01-cvs
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-linux"..."hell": not in executable format: File format not recognized

(gdb) quit
# 

Jak jsem psal v minulém dílu, soubor ./hell je skript, a ne binární soubor (jak také upozorňuje program gdb). Celkem logicky by vás mohlo napadnout, že spustíte binární soubor .libs/hell. Ovšem jak vás přesvědší další řádky, to je též nesprávný postup:

# gdb .libs/hell
GNU gdb 2002-04-01-cvs
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-linux"...
(gdb) break main
Breakpoint 1 at 0x8048547: file main.c, line 29.
(gdb) run
Starting program: ~/.libs/hell
~/.libs/hell: can't load library 'libhello.so.2'

Program exited with code 020.
(gdb) quit
# 

Protože nejsou nainstalovány knihovny, nemohl je program načíst. Tyto dva problémy řeší volba –mode=execute:

libtool --mode=execute gdb hell
GNU gdb 2002-04-01-cvs
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-linux"...
(gdb) break main
Breakpoint 1 at 0x8048547: file main.c, line 29.
(gdb) run
Starting program: ~/.libs/hell

Breakpoint 1, main(argc=1, argv=0xbffffc40) at main.c:29
29  printf ("Welcome to GNU Hell!\n");
(gdb) quit
The program is running. Quit anyway (and kill it)? (y or n) y
# 

Jak je vidět, při použití volby –mode=execute lze program spustit v ladícím programu a provádět všechny potřebné akce.

Instalování knihoven

Při instalaci můžete použít příkazů: cp a install:

# libtool --mode=install cp libhello.la /usr/local/lib/libhello.la
cp libhello.la /usr/local/lib/libhello.la
cp .libs/libhello.a /usr/local/lib/libhello.a
ranlib /usr/local/lib/libhello.a
# 

nebo

#libtool --mode=install install -c libhello.la /usr/local/lib/libhello.la
install -c .libs/libhello.so.0.0 /usr/local/lib/libhello.so.0.0
install -c libhello.la /usr/local/lib/libhello.la
install -c .libs/libhello.a /usr/local/lib/libhello.a
ranlib /usr/local/lib/libhello.a
# 

První případ platí pro systémy, které nemají podporu dynamických knihoven, druhý pro systémy s touto podporou. Nyní zbývá už jen vytvořit linky na dynamické knihovny a „všelijak“ je nakonfigurovat. K tomu slouží příkaz ‚libtool -n –mode=finish libdir‘:

# libtool -n --mode=finish /usr/local/lib
PATH="$PATH:/sbin" ldconfig -m /usr/local/lib
------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib

To link against installed libraries in a geven directory,
LIBDIR, you must use the '-LLIBDIR' flag during linking.

 You will also need to do one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use teh '-RLIBDIR' linker flag
See any operating system documentation about shared libraries
for more information, such as the ld and ld.so manual pages.
------------------------------------------------------
# 

Po dokončení těchto kroků můžete používat knihovny bez jakýchkoliv omezení.

Instalování spustitelných programů

Pokud jste použili libtool ke spojení knihoven a spustitelných programů, musíte použít libtool k instalování těchto programů po nainstalování knihoven. Instalování je opravdu velice jednoduché:

# libtool install -c hell /usr/local/bin/hell
install -c .libs/hell /usr/local/bin/hell
#

Pro dnešek je to vše. Tento a předchozí díl měly být jakýmsi úvodem do libtool. Koho tato problematika zajímá více, ten ať se porozhlédne po dokumentaci. V příštím dílu se budu zabývat procesy, konkrétně vytvořením nového procesu.

Našli jste v článku chybu?