2012-04-10 14 views
9

Sto provando a utilizzare std.net.curl su Ubuntu Linux a 32 bit (11.10 Ocelot) utilizzando DMD 2.058.std.net.curl errori di linker in Linux

Quando costruisco (dmd source.d) ottengo:

/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticCtor30FZv': 
std/net/curl.d:(.text._D3std3net4curl4Curl19_sharedStaticCtor30FZv+0x6): undefined reference to `curl_global_init' 
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticDtor31FZv': 
std/net/curl.d:(.text._D3std3net4curl4Curl19_sharedStaticDtor31FZv+0x4): undefined reference to `curl_global_cleanup' 
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl_12fd_140.o): In function `_D3std3net4curl4HTTP4Impl6__dtorMFZv': 
std/net/curl.d:(.text._D3std3net4curl4HTTP4Impl6__dtorMFZv+0x12): undefined reference to `curl_slist_free_all' 
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl_12fd_140.o): In function `_D3std3net4curl4HTTP3dupMFZS3std3net4curl4HTTP': 
std/net/curl.d:(.text._D3std3net4curl4HTTP3dupMFZS3std3net4curl4HTTP+0x53): undefined reference to `curl_slist_append' 

[snip] 

ho aggiunto -L-lcurl alla mia linea di comando (comando completo: dmd source.d -L-lcurl), ma ottengo lo stesso risultato esatto. Ho installato libcurl4-openssl. Posso creare un programma simple C curl su questo computer senza problemi (gcc simple.c -lcurl). Non sono sicuro da dove guardare da qui per capirlo.

Aggiornamento: Ecco come il linker viene richiamato in base alle dmd -v:

gcc source.o -o source -m32 -lcurl -Xlinker -L/usr/lib -Xlinker -L/usr/lib64 -Xlinker --no-warn-search-mismatch -Xlinker --export-dynamic -lphobos2 -lpthread -lm -lrt 
+1

Prova a eseguire '-v' (' dmd -v source.d -L-lcurl') per vedere come viene richiamato il linker. – kennytm

+0

@KennyTM Post aggiornato con informazioni. – eco

risposta

0

ho capito se ottengo il comando del linker attraverso -v e riordinare in modo che il -lcurl si trova alla fine si collega senza problema.

gcc source.o -o source -m32 -Xlinker -L/usr/lib -Xlinker -L/usr/lib64 -Xlinker --no-warn-search-mismatch -Xlinker --export-dynamic -lphobos2 -lpthread -lm -lrt -lcurl 

Sono ancora curioso di sapere se esiste un modo per risolvere il problema senza eseguire manualmente il linker.

+2

C'è stata una modifica a ld o gcc tale che l'ordine degli argomenti per il collegamento ha importanza, qualcosa sulle dipendenze. Aveva una spiegazione abbastanza buona, ma sembra solo causare problemi come questo. –

+1

Sì, puoi fare: 'dmd source.d -L-lphobos2 -L-lcurl' per correggere l'ordine del linker. –

5

Come hai scoperto, l'ordine delle librerie è errato. Una citazione da "Un'introduzione a GCC": "Una libreria che chiama una funzione esterna definita in un'altra libreria deve essere visualizzata prima della libreria che contiene la funzione." Nel tuo caso libphobos chiama le funzioni della libreria esterna (libcurl), quindi suppongo che libphobos debba andare prima dello libcurl.

Il libro è disponibile online. Il capitolo relativo all'OT è qui: http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html

+0

Grazie per il link. – eco

5

Il compilatore DMD è chiaramente rotto in questo senso. Ho pubblicato una patch per risolvere il problema (forse non la migliore) ma il manutentore del compilatore non è convinto che questo debba essere risolto, quindi non ci sono molte discussioni a riguardo.

+0

Votato per questo su Bugzilla e pubblicato supporto per questo su GitHub. Al momento, tuttavia, fallisce l'autotest. L'autotest ha avuto problemi di recente anche se potrebbe essere dovuto a qualcosa di rotto in HEAD. – eco

+0

Potrebbe essere la patch, è stata eseguita per D1 e l'autotest sottopone a test solo D2.Dovrebbe essere banale adattarsi, non l'ho mai fatto a causa della mancanza di interesse nel fonderlo, ma sarò felice di farlo se l'interesse ci fosse. –

+0

Nel caso in cui non l'avessi visto, [ecco una discussione] (http://forum.dlang.org/thread/[email protected]) sul problema che ho avuto dal newsgroup . – eco

3

Apparentemente il modo più semplice per risolvere il phobos2/ricciolo problema di ordine linker, come accennato altrove in questa discussione:

dmd source.d -L-lphobos2 -L-lcurl 

funziona come un fascino per me.