2012-04-10 12 views
9

Estoy tratando de usar std.net.curl en Ubuntu Linux de 32 bits (11.10 Ocelot) usando DMD 2.058.std.net.curl errores del enlazador en Linux

Cuando construyo (dmd source.d) me sale:

/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] 

he añadido a mi -L-lcurl línea de comandos (comando completo: dmd source.d -L-lcurl) pero me da exactamente el mismo resultado. Tengo libcurl4-openssl instalado. Puedo construir un programa simple C curl en esta computadora sin problema (gcc simple.c -lcurl). No estoy seguro de dónde mirar desde aquí para resolver esto.

Actualización: Aquí es cómo se invoca el enlazador de acuerdo con 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

Intenta ejecutar con '-v' (' dmd -v source.d -L-lcurl') para ver cómo se invoca el enlazador. – kennytm

+0

@KennyTM Publicación actualizada con información. – eco

Respuesta

0

me di cuenta si obtengo comando de enlace a través -v y reordenar lo que el -lcurl es al final se enlaza sin 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 

Todavía estoy ansioso por ver si hay una manera de solucionar este problema sin ejecutar manualmente el enlazador.

+2

Hubo un cambio en ld o gcc tal que el orden de los argumentos para la vinculación importaba, algo sobre las dependencias. Tuve una buena explicación, pero parece que causa problemas como este. –

+1

Sí, puedes hacer: 'dmd source.d -L-lphobos2 -L-lcurl' para arreglar el orden del enlazador. –

5

Como usted mismo descubrió, el orden de las bibliotecas es incorrecto. Una cita de "Una introducción a GCC": "Una biblioteca que llama a una función externa definida en otra biblioteca debe aparecer antes de la biblioteca que contiene la función." En su caso libphobos llama a la (s) función (es) de la biblioteca externa, así que supongo que libphobos debe ir antes que libcurl.

El libro está disponible en línea. El capítulo relacionado con el OT está aquí: http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html

+0

Gracias por el enlace. – eco

5

El compilador de DMD está claramente roto en este sentido. Publiqué un parche para solucionarlo (tal vez no sea el mejor), pero el responsable del compilador no está convencido de que esto deba corregirse, por lo que no hay mucha discusión al respecto.

+0

Votado en Bugzilla y publicado soporte para él en GitHub. Sin embargo, actualmente falla el autotester. El autotester estaba teniendo problemas recientemente, por lo que puede deberse a algo roto en HEAD. – eco

+0

Podría ser el parche, se hizo para D1 y el autotester solo prueba D2.Debería ser algo trivial de adaptar, nunca lo hice debido a la falta de interés en fusionarlo, pero estaré encantado de hacerlo si el interés está ahí. –

+0

En caso de que no lo haya visto, [hay una discusión] (http://forum.dlang.org/thread/[email protected]) sobre el problema que tuve del grupo de noticias . – eco

3

Aparentemente la manera más simple para solucionar el problema de orden enlazador phobos2/rizo, como se ha mencionado en otras partes de este hilo:

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

funciona como un encanto para yo.

Cuestiones relacionadas