Связывание проблем с использованием libcurl с Visual C ++ 2005: «неразрешенный внешний символ __imp__curl_easy_setopt» - PullRequest
2 голосов
/ 09 марта 2010

Я планирую использовать libcurl в моем проекте. Я скачал исходный код библиотеки, собрал и интегрировал его в небольшое приложение POC. Я могу собрать и запустить приложение без каких-либо проблем с созданными файлами libcurl.dll и libcurl_imp.lib. Теперь, когда я интегрирую ту же библиотеку в свой проект, я получаю ошибки компоновщика.

6> foo.obj: ошибка LNK2001: неразрешенный внешний символ __imp__curl_easy_setopt

6> foo.obj: ошибка LNK2001: неразрешенный внешний символ __imp__curl_easy_perform

6> foo.obj: ошибка LNK2001: неразрешенный внешний символ __imp__curl_easy_cleanup

6> foo.obj: ошибка LNK2001: неразрешенный внешний символ __imp__curl_global_init

6> foo.obj: ошибка LNK2001: неразрешенный внешний символ __imp__curl_easy_init

Я исследовал и попробовал все способы обхода, такие как добавление CURL_STATICLIB определений, дополнительных библиотек , , изменение на / MT даже копирование библиотек в каталог выпуска но ничего не работает. Насколько я вижу, единственное различие между подходом № 1 и № 2 в моих шагах состоит в том, что № 1 - это консольное приложение, использующее libcurl.dll, в то время как в моем основном проекте это еще одна библиотека DLL, которая пытается связаться с libcurl.dll. Требует ли это каких-либо изменений в подходе? Могу ли я использовать один и тот же сгенерированный многопоточный файл DLL / MD для обоих (пробовал / MT тоже безуспешно) Есть другие идеи?

Ниже приведены параметры компоновщика.

----------------------------------------------- --За работой----------------------------------------------- -

/ OUT: «C: \ SampleFTP \ Release \ SampleFTP.exe» / НЕПРАВИЛЬНО: НЕТ / НОЛОГО / LIBPATH: "C: \ SampleFTP \ SampleFTP \ Release" / MANIFEST /MANIFESTFILE:"Release\SampleFTP.exe.intermediate.manifest " / DEBUG /PDB:"c:\SampleFTP\release\SampleFTP.pdb " / SUBSYSTEM: CONSOLE / OPT: REF / OPT: ICF / LTCG / MACHINE: X86 / ERRORREPORT: ПОДСКАЖИТЕ libcurl_imp.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

----------------------------------------------- --За работой----------------------------------------------- -

---------------------------------------------- NotWorking -------------------------------------------------

/ OUT: "....... \ nt \ Win32 \ Release / foo__tests.dll" / ДОПОЛНИТЕЛЬНО: НЕТ / НОЛОГО / LIBPATH: "C: \ FullLibPath \ libcurl_libs" /LIBPATH:"......\nt\Win32\Release» / DLL / MANIFEST /MANIFESTFILE:".\foo__tests\Win32\Release\foo__tests.dll.intermediate.manifest "/ DEBUG /PDB:".......\nt\Win32\Release/foo_tests.pdb" / OPT: REF / OPT: ICF / LTCG /IMPLIB:".......\nt\Win32\Release/foo_tests.lib» / MACHINE: X86 / ERRORREPORT: ПОДСКАЖИТЕ odbc32.lib odbccp32.lib util_process.lib wsock32.lib Version.lib libcurl_imp.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib оболочка32.lib объект ole32.lib lib odbccp32.lib "...... \ NT \ win32 \ релиз \ otherlib1.lib" "...... \ nt \ win32 \ release \ otherlib2.lib"

---------------------------------------------- NotWorking -------------------------------------------------

Ответы [ 3 ]

1 голос
/ 12 марта 2010

Хорошо ... Это неудобно ... Мне удалось решить проблему, и, как вы можете догадаться, это не имеет никакого отношения к libcurl .. В основном файл, который ссылается на libcurl, является частью нескольких проектов. Так что, хотя я правильно определил библиотеки в первом проекте, в других - нет. А журнал сборки показывает проекты (сообщения об успехах / неудачах) один за другим, и я мог заметить проблему только при прохождении вместе с моим старший ... В целом унизительный опыт ..

Извлеченный урок (для будущих посетителей здесь) будет - Libcurl является зрелым продуктом и вряд ли сможет использовать его для базовой комплектации. - Единственное, что необходимо, если вы собираетесь использовать Windows. DLL будет 1) Скачать исходник. Откройте файл soln. Сборка (как выпуск dll). 2) Включите дополнительный путь к заголовку для библиотек curl. 3) Включите файл .lib в качестве зависимости при компоновке. 4) Начните делать вызовы curl (включая заголовки curl в источнике)

и тебе надо идти. Для начала (кроме отличного хранилища на домашней странице) у меня есть хороший урок здесь ...

http://www.luckyspin.org/?p=28

1 голос
/ 12 марта 2010

вы запускали команды

curl-config --cflags
curl-config --libs

По результатам --libs я смог найти ссылку на свое приложение.

0 голосов
/ 19 августа 2011

Я согласен с user88595. Кроме того, нам может потребоваться обратить внимание на следующие вещи (из опыта).

Это если у вас есть общая библиотека в вашем проекте:

Скажем, у вас есть решение Visual Studio с «А» - это проект общей библиотеки «B» - целевой исполняемый проект (в большинстве случаев это запускаемый проект). Итак, вам нужно действительно увидеть, кто на самом деле вызывает API libcurl.lib, если они вызываются внутри "A", вам нужно перейти к свойству "библиотекаря" проекта "A" и затем добавить туда зависимость libcurl.lib. Также добавьте пути lib. Я сделал ошибку, добавив зависимость к свойству «компоновщик» и пути lib к «B», что вызвало эту же проблему.

Некоторые дополнительные ошибки компоновщика с LDAP:

.

Как только вы исправите ошибки компоновщика, упомянутые в этом разделе, вы получите еще несколько ошибок относительно LDAP, чтобы разрешить это добавление wldap32.lib в зависимости от компоновщика "B".

Всего наилучшего, Арджун

...