использование libcurl без dll

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

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


person Iron    schedule 05.08.2010    source источник


Ответы (2)


На этот вопрос нет простого ответа :) 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 плохо поддерживает компиляцию Windows из исходных текстов, я бы порекомендовал вам вернуться к идее избавиться от curllib.dll.

person Andrey    schedule 05.08.2010

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

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

Ссылки, которые я использовал:

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

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

person humbads    schedule 17.12.2012