2009-06-05 26 views
91

Lavoro in Linux con C++ (Eclipse) e voglio usare una libreria. Eclipse mi mostra un errore:Errore C++ Linux: riferimento non definito a 'dlopen'

undefined reference to 'dlopen' 

Sai una soluzione?

Qui è il mio codice:

#include <stdlib.h> 
#include <stdio.h> 
#include <dlfcn.h> 

int main(int argc, char **argv) { 
    void *handle; 
    double (*desk)(char*); 
    char *error; 

    handle = dlopen ("/lib/CEDD_LIB.so.6", RTLD_LAZY); 
    if (!handle) { 
     fputs (dlerror(), stderr); 
     exit(1); 
    } 

    desk= dlsym(handle, "Apply"); 

    if ((error = dlerror()) != NULL) { 
     fputs(error, stderr); 
     exit(1); 
    } 

    dlclose(handle); 
} 

risposta

181

Bisogna collegare contro libdl, aggiungere

-ldl

per le opzioni del linker

+2

ho incontrato lo stesso problema ... Ho aggiunto il flag del compilatore in Progetto> Proprietà> C/C++ Build> Impostazioni> (My Linker) > Varie nel campo di testo Flag del linker. Non ha fatto nulla. – MirroredFate

+3

Ha, ok, per chiunque abbia questo problema, usa il percorso sopra, eccetto andare alle Librerie piuttosto che alle Varie e aggiungere "dl" – MirroredFate

+1

Questa risposta è stata d'aiuto. Per chiunque voglia trovare la posizione di libdl.so, basta andare alla directory root e digitare 'locate libdl.so' – Nav

2

Avevi bisogno di fare qualcosa di simile per il makefile:

LDFLAGS = '- ldl' make install

Questo passerà le flag del linker da make through al linker. Non importa che il makefile sia stato generato automaticamente.

1

Ho incontrato lo stesso problema anche utilizzando -ldl.

Oltre a questa opzione, i file di origine devono essere posizionati prima delle librerie, vedere undefined reference to `dlopen'.

40

@Masci è corretto, ma nel caso in cui si sta utilizzando C (e la gcc compilatore) prendere in conto che questo non funziona:

Ma questo fa:

gcc dlopentest.c -ldl 

Mi ha preso un po 'per capire ...

+4

Questa è una "caratteristica" fastidiosa di sicuro ... – User1291

+1

Ho trovato che l'ordine delle opzioni conta anche. Su un progetto che usa sqlite3, devo mettere -ldl (e -lpthread) dopo -lsqlite3. Non so di cosa si tratta, sono sicuro che la risposta è lì se volessi solo RTFM. –

+0

Santa merda, è tutto! Non avrei mai immaginato che mettere le opzioni per primo (che per me ha più senso) non funzioni, mentre metterle dopo lo fa. Grazie, @knocte! –

5

L'argomento è piuttosto vecchio, ma ho lottato con lo stesso problema oggi durante la compilazione di cegui 0.7.1 (prerequisito di openVibe).

Che cosa ha funzionato per me era impostare: LDFLAGS="-Wl,--no-as-needed" nel Makefile.

Ho anche provato -ldl per LDFLAGS ma senza successo.

2

si può provare ad aggiungere questo

LIBS=-ldl CFLAGS=-fno-strict-aliasing 

alle opzioni di configurazione

+0

Usando la variabile LIBS ho lavorato per farmi configurare per mettere -ldl nel posto giusto sulla riga di comando. – duncan

1

Per poter utilizzare le funzioni dl è necessario utilizzare il flag -ldl per il linker.

come lo si fa in eclissi?

Press Project -->Properties -->C/C++ build -->Settings -->GCC C++ Linker -->
Libraries --> in the "Libraries(-l)" box press the "+" sign --> write "dl" (without the quotes)-> press ok -->clean & rebuild your project.

1
$gcc -o program program.c -l <library_to_resolve_program.c's_unresolved_symbols> 

A good description of why the placement of -l dl matters

Ma c'è anche una spiegazione piuttosto succinta nella documentazione Da $ man gcc

-llibrary 
    -l library 
     Search the library named library when linking. (The second 
     alternative with the library as a separate argument is only for POSIX 
     compliance and is not recommended.) 
 It makes a difference where in the command you write this option; the 
     linker searches and processes libraries and object files in the order 
     they are specified. Thus, foo.o -lz bar.o searches library z after 
     file foo.o but before bar.o. If bar.o refers to functions in z, 
     those functions may not be loaded. 
Problemi correlati