Добавление статического libcurl в Code :: Blocks IDE - PullRequest
10 голосов
/ 05 июня 2011

Я не могу понять, как правильно добавить статическую библиотеку libcurl в мою IDE Code :: Blocks. Я хочу, чтобы он был статическим, потому что тогда во время выполнения моей программы не требуются файлы .dll, которые не включены в Windows по умолчанию. Я использую этот libcurl: http://curl.haxx.se/dlwiz/?type=lib&os=Win32&flav=- (минГВт без OpenSSL)

Вот мои глобальные настройки компилятора: http://img845.imageshack.us/img845/1381/halpr.jpg

Я получаю следующую ошибку:

ld.exe || не может найти -lCURL_STATICLIB | || === Сборка завершена: 1 ошибка, 0 предупреждений === |

при компиляции этого кода:

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;
}

Очевидно, он не находит CURL_STATICLIB, но я понятия не имею, почему. Я даже не уверен, нужно ли было добавлять CURL_STATICLIB в мои настройки компоновщика (я читал это на других форумах). Я обнаружил, что у некоторых парней была такая же проблема, но нигде не было дано правильного ответа:

/ stackoverflow.com вопросы / 4176503 / разочарование-с-Libcurl

forums.codeblocks.org / index.php? Тема = 11391,0

old.nabble.com / НКУ-рабочий с-Libcurl-td20506927.html

* +1025 * forums.devshed.com / с-программирование-42 / линкер-ошибки с помощью-Libcurl-698071.html

Я так устал бороться с этим, пожалуйста, помогите мне.

EDIT:

Здравствуйте, Виктор, спасибо за ответ!

Я постараюсь быть максимально подробным, чтобы не было недоразумений. Итак, вот изображение дерева каталогов / папок для моей папки C: \ libs \:

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

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

Мои новые настройки проекта сборки: http://img863.imageshack.us/img863/4404/buildoptions.png Мои новые настройки глобального компилятора: http://img225.imageshack.us/img225/4926/curl2.png

Я уверен, что неправильно настроил эти параметры, и поэтому не могу его скомпилировать.

1 Ответ

21 голосов
/ 09 июня 2011

Хорошо, мне удалось успешно построить ваш пример с помощью libcurl, используя статическую связь. Детали, необходимые для создания этой работы, довольно сложны - правильная настройка может стать хитрой для неосторожных.

Вот шаги, которые я использовал, чтобы сделать эту работу, обязательно внимательно следуйте им:

  1. Перейдите к Параметры сборки проекта-> Настройки компилятора -> # определяет : введите CURL_STATICLIB. Когда это определено, заголовок libcurl.h будет предварительно обработан сигнатурами функций для соответствия статической связи. В противном случае предполагается динамическая связь, и искалеченные имена становятся _imp__*. Неразрешенные ошибки на вашем скриншоте указывают на то, что он пытается установить динамическую ссылку, а не желаемую статическую ссылку.
    image

  2. В разделе Параметры сборки проекта-> Настройки компоновщика-> Библиотеки ссылок убедитесь, что оно содержит следующее: curl, rtmp, idn, ssl, ssh2, crypto, z, ws2_32, wldap32, winmm, gdi32 . Обратите внимание, что порядок важен. Из-за недостатка конструкции линкера gnu сначала нужно перечислить наиболее зависимые библиотеки, а затем наименее зависимые. Другие линкеры, такие как msvc link и borland ilinker, не имеют таких проблем - библиотеки могут быть перечислены в любом порядке.

  3. Под Параметры сборки проекта-> Настройки компоновщика-> Другие опции компоновщика добавить в '-static'. Это обеспечит использование статической версии 'idn'. Если этот параметр пропущен, ваша скомпилированная программа может зависеть от запуска libidn-11.dll, что, вероятно, не то, что вам нужно.
    image

На этом этапе вы сможете без проблем компилировать и связывать программы libcurl. Пара вещей, о которых стоит упомянуть,

  • Под Другие опции компоновщика другие дополнительные ключи из вашего скриншота не нужны. 'libcurl.a' уже внесен в список и покрыт библиотеками ссылок .

  • Кажется, что libcrypto.a содержит те же ссылки, что и libeay32.a, поэтому необходим только один из них. Тем не менее, 'libeay32.a' вызывает динамическое связывание, несмотря на больший размер. Если вы хотите, чтобы ваше приложение было «полностью автономным», используйте «libcrypto.a», как на скриншоте.

  • Если вы хотите в будущем динамически связывать, просто замените список на 'curldll' в Библиотеки ссылок и удалите определение CURL_STATICLIB. Дополнительные библиотеки (например, ssl, idn, rtmp и т. Д.) Не нужны, поскольку libcurl.dll уже покрывает их.

  • Вы можете избежать утомительной, подверженной ошибкам установки новой программы libcurl, используя пользовательские шаблоны кодовых блоков. (например, Файл-> Новый-> Проект-> Пользовательские шаблоны )

Надеюсь, это решит все проблемы со сборкой, которые у вас возникли с libcurl, раз и навсегда.

...