2011-06-05 20 views
8

No puedo encontrar la forma de agregar correctamente una biblioteca libcurl estática a mi Code :: Blocks IDE. Quiero que esté estático porque entonces no se necesitan archivos .dll, que no están incluidos en Windows de forma predeterminada, durante el tiempo de ejecución de mi programa. Estoy usando este libcurl: http://curl.haxx.se/dlwiz/?type=lib&os=Win32&flav=- (Mingw sin OpenSSL)Agregar libcurl estático a Code :: Blocks IDE

Éstos son mis configuración del compilador globales: http://img845.imageshack.us/img845/1381/halpr.jpg

estoy consiguiendo el error siguiente:

ld.exe||cannot find -lCURL_STATICLIB| ||=== Build finished: 1 errors, 0 warnings ===|

al compilar este código:

include <stdio.h> 
include <curl/curl.h> 

int main(void) 
{ 
CURL *curl; 
CURLcode res; 

curl = curl_easy_init(); 
if(curl) { 
curl_easy_setopt(curl, CURLOPT_URL, "http://google.com"); 
res = curl_easy_perform(curl); 

/* always cleanup */ 
curl_easy_cleanup(curl); 
} 
return 0; 
} 

Obviamente no encuentra CURL_STATICLIB, pero no tengo idea de por qué. Ni siquiera estoy seguro de si fue necesario agregar CURL_STATICLIB a mis configuraciones de enlazador (lo leí en otros foros). He encontrado algunos chicos que tienen el mismo problema, pero no es contestada correctamente en cualquier lugar:

stackoverflow.com/questions/4176503/frustrated-with-libcurl

forums.codeblocks.org/index.php?topic=11391.0

old.nabble.com/gcc-working-with-libcurl-td20506927.html

forums.devshed.com/c-programming-42/linker-error-using-libcurl-698071.html

Estoy tan cansado de luchar con esto, por favor, ayúdame.

EDIT:

Hola Victor, gracias por la respuesta!

Trataré de ser lo más detallada posible, para que no haya malentendidos. lo tanto, aquí es la imagen del árbol de directorios/carpetas para mi C: \ libs \ carpeta:

http://img199.imageshack.us/img199/6977/curl1.png

Como se puede ver, sino que también incluye la construcción de registro, se dará cuenta de que el error esta vez es diferente al que publiqué anteriormente. Es porque cambié el compilador global y construí la configuración del proyecto.

Mi nueva configuración del proyecto de construcción: http://img863.imageshack.us/img863/4404/buildoptions.png Mi nueva configuración del compilador: Global http://img225.imageshack.us/img225/4926/curl2.png

Estoy seguro de que han configurado estos ajustes mal y por eso no puedo compilarlo.

+1

¿Solo para obtener un poco más de información también puede proporcionar lo que parece la línea de comando invocada? Para ello, vaya a la pestaña Otras configuraciones y seleccione Línea de comando completa en el menú desplegable. ¿También puede proporcionar una lista de los archivos que existen en su directorio lib/curl-7.x.x */lib? – greatwolf

+0

¿Cómo "instalaste" los archivos libcurl? ¿Acabas de crear un nuevo directorio y copiar la lib e incluir carpetas allí y luego decirle a Codeblocks que busquen allí? Estoy tratando de resolver el problema yo mismo. ¡Gracias! :) – llk

Respuesta

20

Bien, logré construir su ejemplo con éxito con libcurl utilizando enlaces estáticos. Los detalles involucrados para hacer este trabajo son bastante intrincados: configurarlo correctamente puede ser complicado para los incautos.

Estos son los pasos que he usado para hacer este trabajo, asegúrese de seguir cuidadosamente: la configuración

  1. Ir a acumulación Proyecto opciones-> Compilador -> # define: Tipo de CURL_STATICLIB. Cuando esto se define, el encabezado libcurl.h tendrá sus firmas de funciones preprocesadas para adaptarse a la vinculación estática. De lo contrario, se supone un enlace dinámico y los nombres mutilados se convierten en _imp__*. Los errores no resueltos de su captura de pantalla indican que está intentando un enlace dinámico en lugar del enlace estático deseado.

  2. Bajo Proyecto construyen opciones-> Enlazador configuración-> Bibliotecas de Enlace asegurarse de que contiene lo siguiente: rizo, RTMP, IDN, ssl, ssh2, criptografía, z, ws2_32, WLDAP32, WinMM, gdi32. Tenga en cuenta que el orden es importante. Debido a una deficiencia de diseño del enlazador gnu, las bibliotecas más dependientes deben figurar primero seguidas por las menos dependientes. Otros enlazadores como msvc link y borland's ilinker no presentan tales problemas, las bibliotecas se pueden enumerar en cualquier orden.

  3. En Opciones de compilación del proyecto-> Configuración del engarce-> Otras opciones del enlazador agregar en '-estático'. Esto asegurará que se use la versión estática de 'idn'. Si se omite este modificador, entonces su programa compilado podría depender de 'libidn-11.dll' para ejecutarse, que probablemente no sea lo que usted desea.

En este punto, usted debe ser capaz de compilar y enlazar programas libcurl sin ningún problema. Un par de cosas vale la pena mencionar,

  • Bajo Otras opciones de enlazador no son necesarios los otros interruptores adicionales de su pantalla. 'libcurl.a' ya está listado y cubierto por Bibliotecas de enlaces.

  • El 'libcrypto.a' parece cubrir las mismas referencias que el 'libeay32.a' por lo que solo se necesita uno de ellos. Sin embargo, 'libeay32.a' causa un vínculo dinámico a pesar de su mayor tamaño. Si desea que su aplicación sea 'completamente autónoma', use 'libcrypto.a' como en la captura de pantalla.

  • Si desea enlazar dinámicamente en el futuro, basta con sustituir el anuncio como 'curldll' bajo bibliotecas de enlace y retire la CURL_STATICLIB definen. Las bibliotecas adicionales (por ejemplo, ssl, idn, rtmp, etc.) no son necesarias, ya que libcurl.dll ya las cubre.

  • Puede evitar la tediosa configuración propensa a errores de un nuevo programa libcurl empleando plantillas de usuario de bloques de código. (Por ejemplo. Archivo-> Nuevo-> Proyecto-> Plantillas de usuario)

Esperemos que esto se resuelva cualquier problema con la que tienes con libcurl una vez por todas.

+0

¡Gracias por la descripción detallada y consejos! ¡Funcionó para mí construirlo estática y dinámicamente ahora! Solo una, última pregunta: ¿Cómo supiste qué se debe agregar y dónde? ¿Cuál es su fuente desde donde tomó la información? Me gustaría aprender eso también, así que no tengo que enviar spam stackoverflow cada vez que quiero agregar una nueva biblioteca a mi IDE. ¡Una vez mas, Gracias! :) – Javatar

+0

@newbie Los enlaces de su pregunta proporcionaron un buen punto de partida, pero mucho de la experiencia con las herramientas y el ensayo y error.Mingw viene empaquetado con 'nm' y 'objdump' fueron muy útiles: le permiten inspeccionar exactamente qué hay en el archivo de la biblioteca en cuestión (otros compiladores tienen su propia versión de 'objdump'). Combine esto con 'grep' ('findstr' en Windows también funciona) y puede ubicar dónde reside una función específica o un dato (o si existe en primer lugar). La inspección de libcurl.h también proporcionó pistas útiles. Y, por supuesto, el viejo MSDN. – greatwolf

+0

La biblioteca rtmp es irrelevante debido a razones legales (DMCA), resumiendo, es posible vincular estáticamente libcurl, simplemente no manejará rtmp: // urls. Yo mismo no necesitaba eso ni la biblioteca de idn, así que terminé eliminando ambos y funcionó. Mega felicitaciones a las personas que piratean estas bibliotecas detrás de Cygwin y a usted por proporcionar una explicación detallada sobre cómo hacerlo. – Holdsworth

Cuestiones relacionadas