[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] Entry point i shared lib filer



Kasper Hauge wrote:
> Erwin S. Andreasen wrote:
> Nu har jeg prøvet alt !!! tror jeg. Jeg har fundet ud af at _init og
> _fini kun virker til C filer. I mit tilfælde er det C++, som skal være
> et shared lib.

Det er farligt.

Hvis du kigger på symbolerne i en c objekt fil, så vil du se at de
svarer til dine funktionsnavne og variable. Prøv nm fil.o.

I C++ kan du overloade funktioner dvs. fisk(int) og fisk(double) er
to forskellige funktioner, internt gøres det ved at variablen limes
bag efter funktionsnavnet, således at kompileren altid ved hvilken
funktion der skal kaldes. Prøv at søge efter name mangling.

Det betyder at når du fra et program vil addresere symboler i
din c++ library, så skal du vide hvordan funktionsnavne mangles,
ellers dutter den ikke.

Dette er netop årsagen til at man specifiere extern "C" ...
fordi det fortæller c++ kompileren at disse symboler skal ikke
name mangles. Name manglingen giver også en masse problemer
hvis du vil addresere c++ objekter fra c kode af. Derimod er det
let at addresere c symboler fra c++.

> Har du et eksemple der virker ??
Jeg vil gætte på at dllopen søger på et symbol der hedder
_init og _fini, prøv nm på din c++ objekt fil, og se om der
findes sådanne to funktioner, eller hvordan c++ har manglede
dem.
 

Du kunne prøve

extern "C" {
void init() { ... };
void fini() { ... };
}

Og se om det hjælper.
 
> void start()
> {
>   printf ("Start so\n\n");
> }
> 
> void slut()
> {
>   printf ("Stop so\n\n");
> }
> 
> coplilere sådan:
> gcc -fPIC -O -c libtest.cpp
> 
> linker sådan:
> gcc -shared -o libtest.so libtest.o
> 
> 
> mit program som bruger dette shared lib ser sådan ud

-- 
  Mvh. Carsten Svaneborg


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:08 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *