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

27. 2. 2004
Doba čtení: 3 minuty

Sdílet

Ilustrační obrázek
Autor: Depositphotos – stori
Ilustrační obrázek
Dnešní díl naváže na minulý - bude se zabývat knihovnami. Nikoli však takovými věcmi, jako je rozdíl mezi dynamickými a statickými knihovnami, ale skočím rovnou na praktičtější otázky. Naučíte se vytvářet a spojovat knihovny se spustitelnými kódy pomocí nástroje libtool.

Libtool

Libtool je nástroj, který umožňuje snazší práci s knihovnami a programy. Dodává programátorům jednotné „prostředí“ pro téměř všechny operace při vytváření programů a odbourává nesourodost různých platforem. Kapitoly budou dále rozděleny podle postupu při vytváření programů. V tomto článku se budu zabývat pouze systémy podporujícími dynamické knihovny. Použití na systémech pouze se statickými knihovnami je obdobné, bližší informace můžete nalézt v howto.

Vytváření přemístitelných kódů

Nejdříve bych chtěl upozornit, že přemístitelné kódy používané Libtool mají příponu ‚.lo‘ místo ‚.o‘. Teď bude následovat příklad, vysvětlení přijde po něm:

# libtool --mode=compile gcc -g -O -c test.c
gcc -g -O -c -fPIC -DPIC test.c
mv -f test.o test.lo
gcc -g -O -c test.c > /dev/null 2>&1

Parametr –mode=compile říká programu, že má data zkompilovat. Řetězec následující za ním prozrazuje, jak by si toto přeložení programátor představoval. Jak jste si asi všimli, libtool přidává u platforem podporujících dynamické knihovny parametry -fPIC -DPIC. Co znamená PIC, si můžete přečíst v předminulém dílu. Dále si můžete všimnout, že libtool přejmenuje koncovku vytvořeného přemístitelného kódu. A nakonec vytvoří ještě jeden přemístitelný soubor (tentokrát s koncovkou .oa bez voleb -fPIC a -DPIC). Proto se nelekejte, pokud se nějakou dobu na obrazovce neobjeví žádný výstup. Je to zaviněno tím, že se při vytváření druhého přemístitelného kódu vypisují výstupy do /dev/null (viz man 4 null). Takto vytvořený přemístitelný kód (myslím ten s koncovkou .lo) je možné dále použít k slinkování knihovny.

Spojování knihoven

Libtool využívá ke své práci soubor s příponou ‚.la‘. Tento soubor obsahuje informace o knihovně, např. všechny její názvy, a to jak dynamické, tak statické verze. Tento soubor navíc při kompilování nahrazuje pravé jméno knihovny, to vše bude předvedeno.

# libtool --mode=link gcc -g -O -o libhello.la test.lo -rpath /usr/local/lib
rm -fr .libs/libhello.la .libs/libhello.* .libs/libhello.*
gcc -shared  test.lo   -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0
(cd .libs && rm -f libhello.so.0 && ln -s libhello.so.0.0.0 libhello.so.0)
(cd .libs && rm -f libhello.so && ln -s libhello.so.0.0.0 libhello.so)
ar cru .libs/libhello.a  test.o
ranlib .libs/libhello.a
creating libhello.la
(cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la) 

Samotné knihovny jsou v adresáři ./.libs, odkud jsou také volány, dokud nedojde k jejich instalaci. A obsah souboru libhello.la je:

# libhello.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.4.2a (1.922.2.79 2001/11/28 21:50:31)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libhello.so.0'

# Names of this library.
library_names='libhello.so.0.0.0 libhello.so.0 libhello.so'

# The name of the static archive.
old_library='libhello.a'

# Libraries that this one depends upon.
dependency_libs=''

# Version information for libhello.
current=0
age=0
revision=0

# Is this an already installed library?
installed=no

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/usr/local/lib' 

Spojování spouštěcích souborů

Spojování spouštěcích souborů není o nic těžší než spojování knihoven. Výklad zase napíši až po příkladu.

Školení Zabbix

# libtool --mode=link gcc -g -O -o hell main.o libhello.la
gcc -g -O -o .libs/hell main.o  ./.libs/libhello.so -Wl,--rpath -Wl,/usr/local/lib
creating hell 

Příkaz slinkuje přemístitelný kód main.o s knihovnoulibhello.so (všiměte si, že na příkazovém řádku byl zadán soubor libhello.la) a vytvoří skript(!) hell. Samotný spouštěcí soubor hell je v adresáři ./.libs. Skript slouží k spouštění programu, nejsou-li knihovny nainstalovány (jako v tomto případě); pokud se pokusíte spustit samotný program hell, systém vám nahlásí, že potřebná knihovna libhello.so.0 nebyla nalezena. Skript je výhodný, pokud například zkoušíte program se svými knihovnami, ale nechcete je instalovat do systému. Při distribuci je samozřejmě nutné knihovny instalovat, ale o tom v dalším dílu.

Příští díl se bude stále zabývat libtool. Pokusím se vám vysvětlit ladění programů a instalování knihoven a programů.

Autor článku



Nejnovější články