Используйте DLL из программы на C ++. (Borland C ++ Builder и вообще) - PullRequest
2 голосов
/ 15 декабря 2008

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

EDIT: Это код (прямо с / п с домашней страницы curl)

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

РЕДАКТИРОВАТЬ 2: В соответствии с предложением от joe_muc я создал файлы lib с помощью инструмента implib и включил их в путь компоновщика. Я все еще получаю те же ошибки.

Ответы [ 6 ]

2 голосов
/ 26 декабря 2009

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

2 голосов
/ 16 декабря 2008

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

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

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

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

2 голосов
/ 15 декабря 2008

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

редактировать: Онлайн-документы

1 голос
/ 15 декабря 2008

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

1 голос
/ 15 декабря 2008

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

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

0 голосов
/ 15 декабря 2008

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

...