2010-08-05 2 views
8

Я использую Microsoft Visual C++ 2010, и мне нужно создать приложение, которое не требует библиотеки libcurl. Я определяю CURL_STATICLIB в директивах препроцессора и ссылаюсь на libcurl.lib, libcurl_static.lib, ws2_32.lib и winmm.lib, но он все еще требует, чтобы dll работала. Если я ссылаюсь только на libcurl_static.lib, у него есть неопределенные внешние ошибки символов. Как я могу заставить его работать?с использованием libcurl без dll

Я также попытался создать источник, но я получаю 13 ошибок (ничего себе, несчастливое число), которые все говорят «ошибка C2011:« pollfd »: переопределение типа« struct ». Может ли кто-нибудь помочь мне заставить libcurl работать?

ответ

11

Нет простого ответа :) Libcurl зависит от других сторонних библиотек (это зависит от используемого вами бинарного дистрибутива). Поскольку вы избавляетесь от DLL - вам придется связываться с соответствующими сторонними лицами вручную.

Итак, первое, что вам не нужно связывать с libcurl.lib, так как он связывает вас с DLL, которого вы не хотите.

Второй пункт - если вы связываетесь с libcurl_static.lib, то (как уже упоминалось выше) вам также будет ссылка на библиотеки, на которых это зависит. Простой способ сделать это, чтобы сделать что-то вроде этого:

#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 

Но этот путь - вы получите больше трех зависимостей. Кроме того, вы можете искать способ связывания с ними статически, но это совсем другая история.

В качестве другой альтернативы - можно восстановить libcurl_static.lib из источников после отключения всех функций вам не нужно, таким образом, удаления нежелательных зависимостей (как описано в разделе «Отключения конкретных протоколов в Win32 строит» из файла INSTALL) ,

И последний момент - поскольку libcurl имеет довольно плохую поддержку для составления окон из источников, я бы рекомендовал вам вернуться к идее избавиться от curllib.dll.

1

Я получил статическую сборку libcurl для компиляции и ссылки, указав как HTTP_ONLY, так и CURL_STATICLIB в директивах препроцессора проекта libcurl и моего приложения. Это устраняет все зависимости, требуемые протоколами, которые, вероятно, вам не нужны. Приложение теперь работает без каких-либо библиотек DLL.

Помимо приведенного выше, мне просто нужно убедиться, что libcurl.lib и путь к файлам включения curl были установлены в настройках проекта визуальной студии приложения.

Ссылки я использовал:

Отключение конкретных протоколов в Win32 сборки: http://curl.haxx.se/mail/lib-2011-12/0123.html

Использование Libcurl в Visual Studio (устаревшее): http://curl.haxx.se/libcurl/c/visual_studio.pdf

Смежные вопросы