2010-08-05 43 views
8

Estoy usando Microsoft Visual C++ 2010, y necesito hacer una aplicación que no requiera libcurl dll. Estoy definiendo CURL_STATICLIB en las directivas del preprocesador y vinculo a libcurl.lib, libcurl_static.lib, ws2_32.lib y winmm.lib, pero todavía requiere que el dll funcione. Si solo hago un enlace a libcurl_static.lib, tiene errores de símbolo externos no definidos. ¿Cómo puedo hacer que funcione?usando libcurl sin dll

También intenté construir la fuente, pero obtuve 13 errores (wow, desafortunado) que dicen "error C2011: 'pollfd': redefinición de tipo 'struct'". ¿Alguien podría ayudarme a que funcione libcurl?

Respuesta

11

No hay una respuesta simple :) Libcurl depende de otras bibliotecas de terceros (depende de la distribución binaria que esté utilizando). A medida que se deshace de la DLL, deberá vincularse manualmente con los terceros correspondientes.

Bien, entonces el primer punto es que no debe vincular a libcurl.lib ya que lo vincula con la DLL que usted no desea.

Segundo punto: cuando se está enlazando con libcurl_static.lib (como se mencionó anteriormente), también tendrá que vincularse con las bibliotecas de las que depende. Una manera sencilla de hacerlo es hacer algo como esto:

#if defined CURL_STATICLIB 

#if defined _DEBUG 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\lib\\Debug\\curllib_static.lib") 
#else 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\lib\\Release\\curllib_static.lib") 
#endif 

#pragma comment(lib, "ws2_32.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\libeay32.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\openldap.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\ssleay32.lib") 

#endif 

Pero de esta manera - que obtendrá tres dependencias más. Alternativamente, puede buscar una forma de vincularse con ellos estáticamente, pero es una historia diferente.

Como otra alternativa - se puede reconstruir libcurl_static.lib de fuentes después de desactivar todas las características que usted no necesita eliminando así las dependencias no deseadas (como se describe en "Desactivación de protocolos específicos en Win32 construye" INSTALAR de archivo) .

Y punto final - como libcurl tiene bastante poca compatibilidad con la compilación de Windows de las fuentes, recomiendo volver a visitar la idea de deshacerse de curllib.dll.

1

Obtuve una compilación estática de libcurl para compilar y vincular al especificar HTTP_ONLY y CURL_STATICLIB en las directivas de preprocesador del proyecto libcurl y mi aplicación. Esto elimina todas las dependencias requeridas por los protocolos que probablemente no necesite. La aplicación ahora funciona sin requerir ninguna DLL en absoluto.

Además de lo anterior, solo necesitaba asegurarme de que libcurl.lib y la ruta de acceso a los archivos de inclusión curl se establecieran en la configuración del proyecto de estudio visual de la aplicación.

referencias que utilizan:

Desactivación de protocolos específicos en Win32 construye: http://curl.haxx.se/mail/lib-2011-12/0123.html

Usando libcurl en Visual Studio (fuera de moda): http://curl.haxx.se/libcurl/c/visual_studio.pdf