|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2000
Messaggi: 342
|
dlsym e undefined symbol -> spiegazione
--------- Main.cpp -----------
Codice:
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
int main ( )
{
void *handle;
void (*stampa)(void);
char *error;
handle = dlopen ("./libtest.so", RTLD_LAZY);
if (!handle)
{
fprintf (stderr, "dlopen %s\n", dlerror());
exit(1);
}
dlerror(); /* Clear any existing error */
*(void **) (&stampa) = dlsym(handle, "stampa");
if ((error = dlerror()) != NULL)
{
fprintf (stderr, "dlsym %s\n", error);
exit(1);
}
( *stampa )();
dlclose(handle);
return 0;
}
Codice:
#include <iostream>
using namespace std;
void stampa()
{
cout << "ciao sono la prima libreria dinamica che creo" << endl;
}
Codice:
g++ -rdynamic -o Main Main.cpp -ldl g++ -fPIC -c libtest.cpp g++ -shared -o libtest.so libtest.o Codice:
dlsym ./libtest.so: undefined symbol: stampa Codice:
extern "C" void stampa() {...}
Qualcuno sa darmi una spiegazione?
__________________
Membro di HWU Scout Group || Quello che ieri era fantascienza oggi è realtà, quello che oggi è realtà domani sarà solo un ricordo ... Powered by Gentoo 1.4 on kernel 2.6.12.-gentoo-r4 |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jun 2004
Città: Pecetto
Messaggi: 73
|
Perchè le funzioni in C++ sono "decorate":
siccome in C++ la stessa funzione può avere differenti parametri, secondo il tipo di questi viene aggiunto al nome globale una serie di numeri che la caratterizzano. per esempio stampa può diventare stampa012. Se provi a generare con e senza extern C il codice assembler del C++, vdrai la differenza
__________________
Gianni |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:30.



















