отчего возникает ошибка
От: Hard_Club  
Дата: 24.11.09 22:53
Оценка:
из-за чего может возникнуть такое предупреждение во время компиляции

locally defined symbol _curl_easy_setopt imported

curl_easy_setopt — функция библиотеки curl
Re: отчего возникает ошибка
От: Erop Россия  
Дата: 24.11.09 23:42
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>curl_easy_setopt — функция библиотеки curl

А как она объявлена?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: отчего возникает ошибка
От: Hard_Club  
Дата: 25.11.09 08:09
Оценка:
H_C>>curl_easy_setopt — функция библиотеки curl
E>А как она объявлена?

#define CURL_EXTERN __declspec(dllexport)

CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);

CURLcode — enum type
Re: отчего возникает ошибка
От: Lorenzo_LAMAS  
Дата: 25.11.09 08:22
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>из-за чего может возникнуть такое предупреждение во время компиляции


H_C>locally defined symbol _curl_easy_setopt imported


H_C>curl_easy_setopt — функция библиотеки curl


что, гугл не помог?
http://www.google.ru/#hl=ru&source=hp&q=locally+defined+symbol+_curl_easy_setopt+imported&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&aq=f&oq=locally+defined+symbol+_curl_easy_setopt+imported&fp=29838420a2d6fd5c

http://www.mail-archive.com/curlpp@rrette.com/msg00121.html

http://blogs.msdn.com/russellk/default.aspx
Of course, the code must be complete enough to compile and link.
Re[2]: отчего возникает ошибка
От: Lorenzo_LAMAS  
Дата: 25.11.09 08:23
Оценка:
вот тут потолковее ответы вроде http://curl.haxx.se/mail/lib-2005-01/0047.html
Of course, the code must be complete enough to compile and link.
Re[3]: отчего возникает ошибка
От: Hard_Club  
Дата: 25.11.09 08:56
Оценка:
L_L>вот тут потолковее ответы вроде http://curl.haxx.se/mail/lib-2005-01/0047.html

я этоти баги уже пофиксил. осталось одно предупреждение и не могу понять от чего оно сыпеться
Re[4]: отчего возникает ошибка
От: Lorenzo_LAMAS  
Дата: 25.11.09 09:00
Оценка:
H_C>я этоти баги уже пофиксил. осталось одно предупреждение и не могу понять от чего оно сыпеться

у меня нет ни этой библиотеки, ни Windows, подробно ответы я не читал. что там такое было-то? неправильно компонуешь что-то? путаница со статическими и динамическими библиотеками? в одной из ссылок объясняется причина такого предупреждения компилятора/компоновщика — тебе это не подходит?
Of course, the code must be complete enough to compile and link.
Re[4]: отчего возникает ошибка
От: Lorenzo_LAMAS  
Дата: 25.11.09 09:03
Оценка:
Здравствуйте, Hard_Club, Вы писали:

L_L>>вот тут потолковее ответы вроде http://curl.haxx.se/mail/lib-2005-01/0047.html


H_C>я этоти баги уже пофиксил. осталось одно предупреждение и не могу понять от чего оно сыпеться



Ответ Gisle Vanem читал?

From: Gisle Vanem <giva_at_bgnett.no>
Date: Sat, 08 Jan 2005 16:19:08 +0100

"Christopher R. Palmer" wrote:

> After running nmake vc-ssl-zlib, I have a functioning curl.exe and a
> libcurl.lib. Much later in my build process, linking my code which uses
> the multi interface reports:
>
> LINK : warning LNK4049: locally defined symbol "_curl_global_init" imported
> LINK : warning LNK4049: locally defined symbol "_curl_slist_free_all" imported
> LINK : warning LNK4049: locally defined symbol "_curl_slist_append" imported
> LINK : warning LNK4049: locally defined symbol "_curl_easy_cleanup" imported
> LINK : warning LNK4049: locally defined symbol "_curl_easy_setopt" imported
> LINK : warning LNK4049: locally defined symbol "_curl_easy_init" imported
> LINK : warning LNK4049: locally defined symbol "_curl_easy_getinfo" imported
> libmisc.lib(fetch.obj) : error LNK2001: unresolved external symbol
> __imp__curl_version

Looks like you want to use libcurl.dll. Then don't link to libcurl.lib.
Use liburl_imp.lib instead. Ref. FAQ section 5.7.

> As I said, this is likely my error in my build process. Unfortunately, I
> have no idea how the "__imp__" symbols are involved in the whole process
> which is making it somewhat challenging to debug.

The __imp_ symbols are just stubs for functions decorated as
__declspec(dllimport) int foo (void);

These stubs are only helpers to point to the real functions in libcurl.dll.

Of course, the code must be complete enough to compile and link.
Re[3]: отчего возникает ошибка
От: Тот кто сидит в пруду Россия  
Дата: 25.11.09 09:17
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>>>curl_easy_setopt — функция библиотеки curl

E>>А как она объявлена?

H_C>#define CURL_EXTERN __declspec(dllexport)


H_C>CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);


H_C>CURLcode — enum type


А вывод препроцессора смотрел? 99% что где-то при декларировании curl_easy_setopt затесался __declspec(dllimport)
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: отчего возникает ошибка
От: Hard_Club  
Дата: 25.11.09 09:24
Оценка:
ТКС>А вывод препроцессора смотрел? 99% что где-то при декларировании curl_easy_setopt затесался __declspec(dllimport)

вот это уже ответ по существу. надо будет сегодня сгенерить препроцессинг
Re[5]: отчего возникает ошибка
От: Hard_Club  
Дата: 25.11.09 09:25
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Здравствуйте, Hard_Club, Вы писали:


L_L>>>вот тут потолковее ответы вроде http://curl.haxx.se/mail/lib-2005-01/0047.html


H_C>>я этоти баги уже пофиксил. осталось одно предупреждение и не могу понять от чего оно сыпеться



L_L>Ответ Gisle Vanem читал?


читал и уже все пофиксил как там было написано, все заработало, только осталось одно предупреждение
Re[5]: отчего возникает ошибка
От: Hard_Club  
Дата: 25.11.09 20:33
Оценка:
H_C>вот это уже ответ по существу. надо будет сегодня сгенерить препроцессинг

получилось вот что:

__declspec(dllimport) CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
__declspec(dllimport) CURLcode curl_easy_perform(CURL *curl);

но проблема в том, что на curl_easy_perform таких предупреждений не возникает
Re[6]: отчего возникает ошибка
От: Тот кто сидит в пруду Россия  
Дата: 25.11.09 21:25
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>получилось вот что:


H_C>__declspec(dllimport) CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);

H_C>__declspec(dllimport) CURLcode curl_easy_perform(CURL *curl);

H_C>но проблема в том, что на curl_easy_perform таких предупреждений не возникает


Ну поскольку чудес не бывает, а багов в компиляторе и линкере довольно мало, получается что curl_easy_perform либо не используется, либо в собираемом exe/dll не определена.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: отчего возникает ошибка
От: Tilir Россия http://tilir.livejournal.com
Дата: 25.11.09 22:12
Оценка: 18 (2)
Здравствуйте, Hard_Club, Вы писали:

H_C>из-за чего может возникнуть такое предупреждение во время компиляции

H_C>locally defined symbol _curl_easy_setopt imported
H_C>curl_easy_setopt — функция библиотеки curl

Тут нужна небольшая преамбула

Все в целом знают как работает __declspec(dllexport) -- оно добавляет функцию в экспорт.
Гораздо интереснее работает __declspec(dllimport). Он, может использоваться с функциями либо с данными.
Когда используется с функциями, он "встраивает" в код дополнительный уровень косвенности на вызов функции. Всё дело в том что на этапе компиляции (если быть точным линковки) адрес импортируемой функции ещё неизвестен. Линкер просто выделяет специальный кусок памяти который называется "IAT entry" и уже в рантайм заполняется после загрузки конкретной DLL.
Когда используется с данными, он встраивает дополнительный уровень косвенности на каждое обращение к данным, там всё ещё веселей, но у вас, как я понимаю, проблемы с функцией.
Давайте посмотрим что получается. Допустим вы слинковались с вашей curl.lib, где есть определение для curl_easy_setopt и одновремено оставили в коде объявление curl_easy_setopt с модификатором __declspec(dllimport). Что в таком случае делать линкеру? Ваш код требует чтобы он сгенерил IAT entry. Но ваш же код говорит -- я не буду грузить эту dll, у меня уже есть эта функция.
Я бы убивал
Но линкер фирмы microsoft добр и великодушен. Он... генерит фальшивый IAT entry, который указывает на локально определённое тело функции. Посмотрите софтайсом исполняющийся код, убедитесь сами. И, поскольку он вставляет ненужный уровень косвенности, он также выдаёт этот warning.
Суть этого warning -- оповестить вас о потере производительности.
Выход?
Ну например определить макрос который будет делать на объявление функции __declspec(dllimport) только если она *действительно* живёт внутри DLL.
Или, например, забить. Поскольку ничего страшного он не означает.

Подробнее и на английском (правда для мобильных платформ) тут: http://blogs.msdn.com/russellk/default.aspx
Re[2]: отчего возникает ошибка
От: Hard_Club  
Дата: 26.11.09 08:45
Оценка:
T>Подробнее и на английском (правда для мобильных платформ) тут: http://blogs.msdn.com/russellk/default.aspx

Вот наконец-то и разобрались. Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.