Как мне решить эти ошибки связывания libcurl? - PullRequest
8 голосов
/ 30 марта 2011
[Administrator@windows ~]$ g++ client.cpp -lcurl -o client.exe
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0x23): undefined reference to `_imp__curl_global_init'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0x5f): undefined reference to `_imp__curl_formadd'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0x9b): undefined reference to `_imp__curl_formadd'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0xa2): undefined reference to `_imp__curl_easy_init'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0xc8): undefined reference to `_imp__curl_easy_setopt'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0xe4): undefined reference to `_imp__curl_easy_setopt'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0xf1): undefined reference to `_imp__curl_easy_perform'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0x101): undefined reference to `_imp__curl_easy_cleanup'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0x10e): undefined reference to `_imp__curl_formfree'
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccKXFUtC.o:client.cpp:(.text+0x11b): undefined reference to `_imp__curl_slist_free_all'
collect2: ld returned 1 exit status

У меня нет этой проблемы в Linux, поэтому я не знаю, почему это происходит в Windows. Я уже погуглил его и ничего не нашел, кроме архивов списков рассылки с тем же вопросом и ответом "google it".

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

*** Warning: linker path does not have real file for library -lssl.
*** I have the capability to make that library automatically link in when
*** you link to this library.  But I can only do this if you have a
*** shared version of the library, which you do not appear to have
*** because I did check the linker path looking for a file starting
*** with libssl and none of the candidates passed a file format test
*** using a file magic. Last file checked: /ssl/lib/libssl.a

*** Warning: linker path does not have real file for library -lcrypto.
*** I have the capability to make that library automatically link in when
*** you link to this library.  But I can only do this if you have a
*** shared version of the library, which you do not appear to have
*** because I did check the linker path looking for a file starting
*** with libcrypto and none of the candidates passed a file format test
*** using a file magic. Last file checked: /ssl/lib/libcrypto.a

*** Warning: linker path does not have real file for library -lz.
*** I have the capability to make that library automatically link in when
*** you link to this library.  But I can only do this if you have a
*** shared version of the library, which you do not appear to have
*** because I did check the linker path looking for a file starting
*** with libz and none of the candidates passed a file format test
*** using a file magic. Last file checked: /mingw/lib//libz.a
*** The inter-library dependencies that have been dropped here will be
*** automatically added whenever a program is linked with this library
*** or is declared to -dlopen it.

*** Since this library must not contain undefined symbols,
*** because either the platform does not support them or
*** it was explicitly requested with -no-undefined,
*** libtool will only create a static version of it.

Ответы [ 4 ]

8 голосов
/ 13 ноября 2012

Мне удалось избежать этих ошибок скручивания ссылок в Windows (mingw win32), добавив параметр -lcurl.dll.-DCURL_STATICLIB в моем случае не требовалось.

Моя сборка содержит два файла libcurl в папке mingw / lib: libcurl.a and libcurl.dll.a

6 голосов
/ 30 марта 2011

Libtool создал только статический libcurl, а не динамическую библиотеку. Ваши заголовки ищут динамический libcurl. Вероятно, это не ошибка libcurl, потому что я вижу код в заголовках, который поддерживает __declspec(dllimport) и __declspec(dllexport) (это хороший знак, что автор пакета знает, что к чему.

Технические подробности: см. Этот ответ относительно libssh .

Решение: Компилировать с -DCURL_STATICLIB.

1 голос
/ 06 января 2013

Возникла та же проблема с использованием netbeans 7.1 с mingw. Из свойств компоновщик, добавляющий библиотеку libcurl.dll.a, решил проблему для меня.

Этот файл был расположен в папке curl-7.28.1 \ lib.libs после того, как я запустил make mingw.

0 голосов
/ 26 сентября 2014

У меня была похожая ошибка (с libz и libsqlite) в разных проектах. Он создается скриптом GNU libtool.

Причиной в моем случае было отсутствие некоторых файлов для этих библиотек (.la?) Или, возможно, libz.dll.a вариантов библиотек.

Чтобы иметь все необходимые файлы для сборки automake / autoconf ./configure --prefix=... ; make, вам нужно собрать zlib, crypto и ssl с configure и make в одном MSYS. Сборки cmake или custom makefile обычно не работают как зависимости для сборки autotool совместно используемой библиотеки.

Другим и наиболее простым вариантом является создание динамического скручивания с помощью cmake (https://github.com/bagder/curl.git)

...