aaron@isotton.com
2003.08.12
Verzi�t�rt�net | ||
---|---|---|
Verzi�: 1.03 | 2003.08.12 | �tdolgozta: AI |
Referencia hozz�ad�sa a GLib dinamikus modul bet�lt�j�r�l. K�sz�net �rte G. V. Sriraam-nak. | ||
Verzi�: 1.02 | 2002.12.08 | �tdolgozta: AI |
GYIK hozz�ad�sa. Kisebb v�ltoztat�sok. | ||
Verzi�: 1.01 | 2002.06.30 | �tdolgozta: AI |
Friss�tett magyar�zat a virtu�lis dekonstuktorokr�l. Kisebb v�ltoztat�sok. | ||
Verzi�: 1.00 | 2002.06.19 | �tdolgozta: AI |
A „Szerz�i jog �s licenc” fejezet az elej�re ker�lt. „A dokumentumban haszn�lt kifejez�sek” fejezet hozz�ad�sa. Kisebb v�ltoztat�sok. | ||
Verzi�: 0.97 | 2002.06.19 | �tdolgozta: JYG |
Egy kis sz�t�r, valamint mondat-szint� v�ltoztat�sok. | ||
Verzi�: 0.96 | 2002.06.12 | �tdolgozta: AI |
Irodalomjegyz�k hozz�ad�sa. Az extern f�ggv�nyek �s v�ltoz�k le�r�s�nak jav�t�sa. | ||
Verzi�: 0.95 | 2002.06.11 | �tdolgozta: AI |
Kisebb jav�t�sok. |
Ez a HOGYAN els�dleges a http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/ webhelyen tal�lhat� meg.
�r�mmel mondok k�sz�netet az al�bbi szem�lyeknek (abc sorrendben):
Joy Y Goodreau <joyg (at) us.ibm.com> a szerkeszt�s�rt.
D. Stimitis <stimitis (at) idcomm.com> r�mutatott n�h�ny k�rd�sre a form�z�ssal �s a n�v sz�tszed�ssel kapcsolatban valamit az extern "C"-vel kapcsolatban.
Visszajelz�st sz�vesen fogadok. A megjegyz�seidet, kritik�dat �s a hozz�j�rul�saidat a <aaron@isotton.com> c�mre k�ldheted.
A magyar ford�t�st Szalai Ferenc k�sz�tette (2004.04.17). A lektor�l�st Daczi L�szl� v�gezte el (2004.05.04). Utolj�ra jav�tva 2004.05.05.-�n (r2). A dokumentum legfrissebb v�ltozata megtal�lhat� a Magyar Linux Dokument�ci�s Projekt honlapj�n.
A C nyelvben a program k�nyvt�rak bet�lt�se igen egyszer� (dlopen, dlsym �s dlclose megh�v�sa elegend�). C++-al ez egy kicsit bonyolultabb. A C++ program k�nyvt�rak bet�lt�s�nek neh�zs�get r�szint a „nevek sz�tszed�se”, r�szben pedig az a t�ny okozza, hogy a dlopen API C-ben lett �rva, �gy nem teszi lehet�v� oszt�lyok egyszer� bet�lt�s�t.
Miel�tt bemutatn�nk a programk�nyvt�rak bet�lt�s�t, C++-ban megvizsg�ljuk a „n�v sz�tszed�si” probl�m�t egy kicsit alaposabban. Azt aj�nlom akkor is olvasd el ezt a r�szt, ha nem �rdekel, mert seg�t meg�rteni mi is a probl�ma �s mi a megold�sa.
P�lda 1. Egy f�ggv�ny bet�lt�se
main.cpp:
#include <iostream> #include <dlfcn.h> int main() { using std::cout; using std::cerr; cout << "C++ dlopen demo\n\n"; // open the library cout << "Opening hello.so...\n"; void* handle = dlopen("./hello.so", RTLD_LAZY); if (!handle) { cerr << "Cannot open library: " << dlerror() << '\n'; return 1; } // load the symbol cout << "Loading symbol hello...\n"; typedef void (*hello_t)(); hello_t hello = (hello_t) dlsym(handle, "hello"); if (!hello) { cerr << "Cannot load symbol 'hello': " << dlerror() << '\n'; dlclose(handle); return 1; } // use it to do the calculation cout << "Calling hello...\n"; hello(); // close the library cout << "Closing library...\n"; dlclose(handle); } |
hello.cpp:
#include <iostream> extern "C" void hello() { std::cout << "hello" << '\n'; } |
![]() | K�t t�pusa l�tezik az extern "C" deklar�ci�nak: extern "C" ahogy fent is haszn�ltuk, �s extern "C" { … } a deklar�ci� kapcsos z�r�jelek k�z�tt. Az els� (inline) forma egy deklar�ci� ami egyszerre extern �s C nyelv� ki�rt�kel�st �r el�, m�g a m�sodik csak a nyelvi el��r�st befoly�solja. Az al�bbi k�t deklar�ci� ekvivalens: �s Ahogy nincs k�l�nbs�g extern �s a nem-extern f�ggv�ny f�ggv�nydeklar�ci�k k�z�tt sem. Ez mindaddig nem jelent probl�m�t am�g nem deklar�lsz v�ltoz�kat. Ha v�ltoz�kat deklar�lsz tartsd �szben, hogy �s nem ugyanaz a dolog.Tov�bbi r�szleteket tal�lsz a [ISO14882], 7.5 fejezet�ben, k�l�n�s tekintettel a 7. bekezd�sre vagy a [STR2000], 9.2.4. paragrafus�ban. Miel�tt b�rmi extra dolgot csin�ln�l az extern v�ltoz�kkal, aj�nlott elolvasni a „Tov�bbi inform�ci�” fejezetben felsorolt dokumentumokat. |
Ahhoz, hogy oszt�lyt t�lts be modulb�l csak a k�t factory f�ggv�nyt kell bet�ltened a dlsym seg�ts�g�vel. Szerkeszteni (link) ugyan�gy kell, mint ahogy azt ebben r�szben tett�k a hello f�ggv�nnyel. Ezek ut�n m�r annyi p�ld�nyt tudsz l�trehozni �s felszabad�tani az oszt�lyb�l, amennyit csak akarsz.
P�lda 2. Egy oszt�ly bet�lt�se
Itt mi most egy �ltal�nos polygon oszt�lyt haszn�lunk, mint interf�sz �s egy sz�rmaztatott triangle oszt�lyt, mint implement�ci�t.
main.cpp:
#include "polygon.hpp" #include <iostream> #include <dlfcn.h> int main() { using std::cout; using std::cerr; // load the triangle library void* triangle = dlopen("./triangle.so", RTLD_LAZY); if (!triangle) { cerr << "Cannot load library: " << dlerror() << '\n'; return 1; } // load the symbols create_t* create_triangle = (create_t*) dlsym(triangle, "create"); destroy_t* destroy_triangle = (destroy_t*) dlsym(triangle, "destroy"); if (!create_triangle || !destroy_triangle) { cerr << "Cannot load symbols: " << dlerror() << '\n'; return 1; } // create an instance of the class polygon* poly = create_triangle(); // use the class poly->set_side_length(7); cout << "The area is: " << poly->area() << '\n'; // destroy the class destroy_triangle(poly); // unload the triangle library dlclose(triangle); } |
polygon.hpp:
#ifndef POLYGON_HPP #define POLYGON_HPP class polygon { protected: double side_length_; public: polygon() : side_length_(0) {} void set_side_length(double side_length) { side_length_ = side_length; } virtual double area() const = 0; }; // the types of the class factories typedef polygon* create_t(); typedef void destroy_t(polygon*); #endif |
triangle.cpp:
#include "polygon.hpp" #include <cmath> class triangle : public polygon { public: virtual double area() const { return side_length_ * side_length_ * sqrt(3) / 2; } }; // the class factories extern "C" polygon* create() { return new triangle; } extern "C" void destroy(polygon* p) { delete p; } |
N�h�ny dolgot meg kell jegyezn�nk az oszt�lyok bet�lt�s�vel kapcsolatban:
Ha az alap oszt�lyodnak nincs sz�ks�ges dekonstruktorra akkor is defini�lj egy �reset (�s virtual-t), k�l�nben el�bb vagy ut�bb probl�m�id lesznek. Ezt garant�lom. T�bbet tudhatsz meg err�l a probl�m�r�l a C++ FAQ lite webhelyen tal�lhat� comp.lang.c++ GYIK 20. fejezet�b�l.
Olvasd el a Programk�nyvt�r HOGYAN (Program Library HOWTO) 4. fejezet�t (Dinamikusan bet�lthet� (Dynamically Loaded; DL) programk�nyvt�rak; Dynamically Loaded (DL) Libraries). Ez tov�bbi inform�ci�kkal szolg�l olyan technik�kr�l, amelyekkel platformf�ggetlen�l t�lthetsz be programk�nyvt�rakat �s k�sz�thetsz oszt�lyokat.
Vannak alternat�v megold�sok: libtltdl (a libtool r�sze), ami a k�l�nb�z� dinamikus bet�lt� API-khoz ny�jt egys�ges fel�letet, k�zt�k a dlopen �s a LoadLibrary API-khoz is. Egy m�sik lehet�s�g a Dynamic Loading of Modules (A GLib dinamikus modul bet�lt�s). Haszn�ld ezeket a jobb platformf�ggetlens�g biztos�t�sa �rdek�ben. �n soha nem haszn�ltam �ket, �gy nem tudom megmondani neked mennyire stabilak �s hogyan m�k�dnek.
A dlopen(3) k�zik�nyv oldalai. Ez kifejti a dlopen API c�lj�t �s a haszn�lat�t.
A Dynamic Class Loading for C++ on Linux cikk James Norton toll�b�l a Linux Journal-on.
A kedvenc C++ referenci�d a extern "C"-r�l, �r�kl�d�sr�l, virtu�lis f�ggv�nyekr�l, new �s delete oper�torokr�l. A [STR2000] aj�nlott.
[ISO14882]
A Programk�nyvt�r HOGYAN (Program Library HOWTO) mintent tartalmaz, amire valaha sz�ks�ged lesz statikus, megosztott �s dinamikusan bet�lthet� programk�nyvt�rakkal kapcsolatban. Melegen aj�nlott.
A Linux GCC HOWTO-b�l t�bbet tudhatsz meg arr�l, hogyan k�sz�thetsz programk�nyvt�rakat GCC-vel.
ISO14482 ISO/IEC 14482-1998 — The C++ Programming Language. PDF �s nyomtatott k�nyv form�j�ban is el�rhet� a http://webstore.ansi.org/ webhelyen.