[so] [Tema 3] Functii callback

Octavian Purdila tavi at cs.pub.ro
Sat Dec 2 18:56:06 EET 2006


On Saturday 02 December 2006 18:10, Mircea Bardac wrote:
> Salut,
>
> OS: Linux
> Disclaimer: I might be missing something
> (ma voi referi doar la LibMonitor, nu la LibRW)
>
> Din ce au compilat altii, nu prea mi-am dat seama cum au rezolvat problema
> aceasta. Din ce a compilat tavi, am presupus ca a incarcat dinamic (-ldl)
> something unde sunt implementate functiile de control.
>
> Reasoning path:
> 1. biblioteca noastra trebuie sa apeleze functiile definite in
> CallbackMonitor.h.
>
> 2. ca sa le poata apela, trebuie ca acestea sa fie definite undeva,
> descopar ca sunt definite in _test/ControlMonitor.c.
>
> 3. in aceste conditii, daca nu includ manual acest fisier in sursele mele,
> eu trebuie sa pot link-a _test/ControlMonitor.o in biblioteca mea atunci
> cand apelez (folosesc C++): g++ -shared (lista fisiere obiect compilate cu
> -fPIC) -o LibMonitor.so
>
> 4. Urmaring modul de utilizare al lui Makefile.checker (+ continutul lui)
> din http://cs.pub.ro/~so/index.php?section=Teme&file=Tema%203#Testare
> descopar ca _test/ControlMonitor.o (si _test/ControlRW.o) sunt create DUPA
> ce biblioteca mea se link-editeaza => on a clean run (=no .o files around),
> linking-ul meu cu respectivul fisier obiect nu va merge. Solutie: cele 2
> fisiere obiect pentru control ar trebui mutate in target-ul build-pre <==
> PROBLEMA NR. 1
>


ELF-ul permite ca bibliotecile dinamice sa aibe simboluri nedefinite la 
link-time ele urmand sa fie rezolvate la runtime. Deci, nu trebuie sa linkezi 
explicit cu _test/ControlMonitor.o. 

PE-ul nu permite acest lucru, si din cauza asta a trebuit sa introducem 
pre-build si post-build pe Windows.

> 6. Chiar si asa, programul meu compilat cu g++-ul, nu se poate folosi de
> definitiile din CallbackMonitor.h deoarece simpla includere a acestora va
> rezulta in aparitia unor simboluri mangle-uite la nume, ca asa face C++-ul
> => nu se va link-edita cu fisierul obiect compilat cu gcc-ul
> _test/ControlMonitor.o. Solutia a fost utilizarea in CallbackMonitor.h a:
>
> // header inclusion check
>
> #ifdef __cplusplus
> extern "C" {
> #endif
>
> // definitions
>
> #ifdef __cplusplus
> }
> #endif
>
> Probabil, acelasi lucru trebuie facut si in CallbackRW.h - nu am ajuns inca
> in respectivul punct.
>

Corect.


tavi


More information about the so mailing list