2008-12-15 2 views
2

Я пытаюсь использовать dll, а именно libcurl, с моей программой, но это не связывание. Libcurl поставляется с файлами .h, которые я могу включить (позаботится о dllimport), но потом, я думаю, я должен указать, какую dll использовать при связывании как-то ... Как это сделать? Я компиляции с Borland C++ Builder, но я действительно хочу знать, как эти вещи работают вообще ...Используйте dll из программы C++. (borland C++ builder и вообще)

EDIT: Это код (прямо с/п от завитка страницы)

bool FTPGetFile::ConnectToFTP(string ftpServer){ 
CURL *curl; 
CURLcode res; 
curl = curl_easy_init(); 
if(curl) { 
    curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); 
    res = curl_easy_perform(curl); 
    return true; 
}else{ 
    return false; 
} 
} 

а вот ошибки:

 
[Linker Error] Error: Unresolved external '_curl_easy_init' referenced from C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ 
[Linker Error] Error: Unresolved external '_curl_easy_setopt' referenced from C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ 
[Linker Error] Error: Unresolved external '_curl_easy_perform' referenced from C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ 

EDIT 2: по предложению от joe_muc я сделал Lib файлы с помощью инструмента Implib и включил их в пути компоновщика. Я все равно получаю те же ошибки.

ответ

2

Как уже упоминалось, вам потребуется статический файл .lib, который идет с .dll, который запускается через Implib и добавить Lib файл результата для вашего проекта.

Если вы сделали, что тогда:

  • Вам может понадобиться использовать STDCALL соглашение о вызове. Вы не указали, какую версию Builder вы используете, но обычно находится в разделе «Параметры проекта» - «Расширенный компилятор» - «Вызов».
  • Возможно, вам потребуется включить возможность совместимости с MFC.
  • Это может быть проблема с изменением имени (параметры проекта - параметры совместимости на C++).
  • Или поколение подчеркивает
  • Или расширенные опции компоновщика "Case_insensitive-связь" или выключить

Libcurl, как представляется, код C; но если это C++, обратите внимание, что классы Microsoft и Borland обычно несовместимы. Предполагается, что они будут хитрости, чтобы заставить их работать, но это настоящий беспорядок, и я никогда не имел успеха. C кодированные DLL должны работать.

1

Обычно, если вы связываетесь с Windows DLL, вам нужно передать имя библиотеки DLL или библиотеки импорта в компоновщик, иначе она не сможет связать исполняемый файл.

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

+0

Добавил код и ошибки на вопрос – c0m4 2008-12-15 10:26:41

+0

У меня нет файла .lib при загрузке libcurl precompiled ... Я добавил путь к dlls в компоновщик. Еще не повезло. – c0m4 2008-12-15 10:48:30

+0

Тогда я попытался бы построить библиотеку. Возможно, библиотека, которую вы используете, ориентирована на использование Visual C++, поскольку Microsoft Linker не обязательно нуждается в библиотеке импорта. – 2008-12-15 10:53:25

1

На сегодняшний день наиболее распространенным решением является использование библиотеки импорта (.lib), которую вы должны получить как часть построения libcurl. Это сообщает статическому компоновщику, как подготовить EXE для динамической загрузки.

+0

Является ли .lib таким же, как .a? Все, что у меня есть, это файлы .a, DLL-файлы и файлы .h. – c0m4 2008-12-15 10:39:36

0

Вы пытались добавить файл .h в свой проект?

+0

Да, файл h есть – c0m4 2008-12-15 11:57:27

2

В каталоге bin или app для строителя должна быть программа IMPLIB.EXE. Запустите это, чтобы создать DLL-файл.

редактировать: Online Docs

2

Используйте «Depends.Exe» для просмотра .DLL и найдите точные имена функций, которые вы хотите использовать, затем добавьте файл .lib для dll (или создайте его с помощью импликации borland) и включите .lib-файл в файле проекта bpr, щелкнув правой кнопкой мыши и добавив его в проект. затем в верхней части кода используйте __declspec (dllimport), чтобы угодить богам-линкерам.