Русское сообщество по скриптингу

error LNK2001: неразрешенный внешний символ. Как так?!

Все вопросы по скриптингу для Metamod, помощь в редактировании плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для
Metamod.


Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник плагина.

error LNK2001: неразрешенный внешний символ. Как так?!

Сообщение Chuvi » 26 окт 2013, 12:40

Ситуация.
Есть программа, к которой при компиляции подключается .lib-ка.
В lib-ке объявлен символ. При этом он прописан и в .c и в .h (в .h он прописан как extern)
При компиляции основной программы этот символ внезапно становится неразрешённым.

Подскажите, пожалуйста, в какую сторону копать?
А, да, соглашения о вызовах и в .lib и в основной программе стоят одинаковые.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: error LNK2001: неразрешенный внешний символ. Как так?!

Сообщение 6a6kin » 26 окт 2013, 17:11

Если соглашение __stdcall, то просто выставить одинаковое не покатит, так как имена stdcall функций транслируются в следующие:
_Foo@8, где 8 - размер параметров.

Чтобы экпортировать имена в нужном формате, нужно в проекте lib добавить def файл или директиву нужную.

Я использую обычно такую:
Код: Выделить всё
#if defined _MSC_VER
   #pragma comment(linker, "/EXPORT:Foo=_Foo@8")
#endif


Какое именно имя экспортирует lib можно глянуть в IDA Pro во вкладке Export.
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: error LNK2001: неразрешенный внешний символ. Как так?!

Сообщение Chuvi » 26 окт 2013, 19:10

6a6kin, а если __cdecl?
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: error LNK2001: неразрешенный внешний символ. Как так?!

Сообщение 6a6kin » 26 окт 2013, 19:51

А глянь через IDA какие символы экспортирует lib файл.

Добавлено спустя 1 минуту 21 секунду:
В исходниках lib должно быть что-то вроде:
Код: Выделить всё
extern "C" __declspec(dllexport) void Foo(void);
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8