2010-08-05 5 views
8

J'utilise Microsoft Visual C++ 2010, et j'ai besoin de faire une application qui ne nécessite pas la DLL libcurl. Je suis en train de définir CURL_STATICLIB dans les directives du préprocesseur et de lier à libcurl.lib, libcurl_static.lib, ws2_32.lib, et winmm.lib, mais il faut toujours que la DLL fonctionne. Si je ne fais que lier à libcurl_static.lib, il y a des erreurs de symboles externes non définies. Comment puis-je le faire fonctionner?en utilisant libcurl sans dll

J'ai aussi essayé de construire la source mais j'ai 13 erreurs (wow, nombre malchanceux) qui disent toutes "erreur C2011: 'pollfd': redéfinition du type 'struct'". Quelqu'un pourrait-il m'aider à faire fonctionner libcurl?

Répondre

11

Il n'y a pas de réponse simple :) Libcurl dépend d'autres bibliothèques tierces (cela dépend de la distribution binaire que vous utilisez). Comme vous vous débarrassez de DLL - vous devrez créer un lien avec les tiers correspondants manuellement.

Ok, donc le premier point est que vous ne devriez pas lier à libcurl.lib car il vous lie à DLL que vous ne voulez pas.

Deuxième point - lorsque vous liez avec libcurl_static.lib puis (comme mentionné ci-dessus), vous devrez également lier avec les bibliothèques dont il dépend. Simple façon de le faire est de faire quelque chose comme ceci:

#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 

Mais cette façon - vous obtiendrez trois autres dépendances. Alternativement, vous pouvez rechercher un moyen de les relier statiquement, mais c'est une histoire différente.

Comme une autre alternative - vous pouvez reconstruire libcurl_static.lib des sources après la désactivation de toutes les fonctionnalités que vous n'avez pas besoin éliminant ainsi les dépendances indésirables (comme décrit dans « Désactivation des protocoles spécifiques dans Win32 builds » du fichier INSTALL) .

Et le point final - comme libcurl a un support assez pauvre pour la compilation de Windows à partir de sources, je vous recommande de revisiter l'idée de se débarrasser de curllib.dll.

1

J'ai obtenu une compilation statique de libcurl pour compiler et lier en spécifiant à la fois HTTP_ONLY et CURL_STATICLIB dans les directives du préprocesseur du projet libcurl et de mon application. Cela élimine toutes les dépendances requises par les protocoles dont vous n'avez probablement pas besoin. L'application fonctionne maintenant sans nécessiter de DLL du tout. En plus de ce qui précède, j'avais juste besoin de m'assurer que libcurl.lib et le chemin d'accès aux fichiers include curl étaient définis dans les paramètres du projet de studio visuel de l'application.

Références I utilisés:

Désactivation des protocoles spécifiques dans Win32 builds: http://curl.haxx.se/mail/lib-2011-12/0123.html

En utilisant libcurl dans Visual Studio (obsolète): http://curl.haxx.se/libcurl/c/visual_studio.pdf