Объясняю ситуацию. Есть у меня либа статическая, которой пользуюсь давно, и проблем с ней не было. Какое-то время назад я стал рефакторить ее код и всех связанных с ней проектов - загнал в солюшн (VC 2005) сначала ее, а затем стал потихоньку подключать все остальное. Месяца три шло все хорошо, но в какой-то момент я подключил проект, который стал использовать модуль консоли. Код (Text): ... void CON_Init(); void CON_Shutdown(); void CON_Show(bbool show); void CON_Toggle(); ... bbool CON_Execute(bbool restricted, char* fmt, ... ); bbool CON_ExecuteFile(const char* fileName); bbool CON_SaveVars(const char* fileName); char* CON_MatchCommand(char* nameStart, uint32 nameCmpLen, uint32 matchSkipCount); void CON_Printf(const char* fmt, ... ); uint32 CON_GetNumPrintLines(); char* CON_GetPrintLine(uint32 index); void CON_SetPrintCallback(void (*callback)(const char*)); ... Все функции линкуются нормально, кроме двух! Код (Text): Linking... State.obj : error LNK2019: unresolved external symbol "unsigned char __cdecl CON_Execute(unsigned char,char *,...)" (?CON_Execute@@YAEEPADZZ) referenced in function "void __cdecl TimeScale_confunc_body(class CConVar *,int,char * *)" (?TimeScale_confunc_body@@YAXPAVCConVar@@HPAPAD@Z) tked.lib(con_main.obj) : error LNK2001: unresolved external symbol "unsigned char __cdecl CON_Execute(unsigned char,char *,...)" (?CON_Execute@@YAEEPADZZ) tked.lib(con_win.obj) : error LNK2001: unresolved external symbol "unsigned char __cdecl CON_Execute(unsigned char,char *,...)" (?CON_Execute@@YAEEPADZZ) tked.lib(con_win.obj) : error LNK2019: unresolved external symbol "void __cdecl CON_SetPrintCallback(void (__cdecl*)(char const *))" (?CON_SetPrintCallback@@YAXP6AXPBD@Z@Z) referenced in function "void __cdecl CONW_Init(void)" (?CONW_Init@@YAXXZ) Я и так уже, и эдак, никак. Уже и из либы модули вытащил, подключил их напрямую в проект - бестолку. Переименовывал эти функции - бестолку. Заколдованные какие-то. Только когда я коменчу вызовы этих функций (CON_Execute, CON_SetPrintCallback) все собирается. В чем дело - непонятно. У либы есть особенность - она целиком на C, кроме модулей консоли (С++) - может в этом проблема? Но почему тогда на другие функции не ругается? Непонятно что делать, может есть какие-то мысли?
mad_fat_rabbit Чтобы не гадать, проще всего посмотреть манглированные имена этих ф-ций в либе. Если нужно, могу глянуть сам - выложи либу или объектники, содержащие эти ф-ции.
Вот что показала IDA: Код (Text): ; void __cdecl CON_SetPrintCallback(void (__cdecl *)(char *)) public ?CON_SetPrintCallback@@YAXP6AXPAD@Z@Z ?CON_SetPrintCallback@@YAXP6AXPAD@Z@Z proc near ; unsigned char __cdecl CON_Execute(unsigned char, char const *, ...) public ?CON_Execute@@YAEEPBDZZ ?CON_Execute@@YAEEPBDZZ proc near объектник выложил если что на http://www.games4free.ru/files/con_main.obj
Продолжаю свои мучения ) Да, похоже дело в манглировании функций. Обратил внимание (green, спасибо), что в ошибках показываются функции Код (Text): CON_Execute@@YAEEPADZZ CON_SetPrintCallback@@YAXP6AXPBD@Z@Z а IDA говорит что там есть функции Код (Text): CON_Execute@@YAEEPBDZZ CON_SetPrintCallback@@YAXP6AXPAD@Z@Z выходит что в именах поменялись местами части имен PBD и PAD. Чудеса какие-то...
mad_fat_rabbit Ошибка в том, что эти ф-ции у тебя декларируются и определяются по разному. Декларации: bbool CON_Execute(bbool restricted, char* fmt, ... ); void CON_SetPrintCallback(void (*callback)(const char*)); Определения: bbool CON_Execute(bbool restricted, const char* fmt, ... ) { ... } void CON_SetPrintCallback(void (*callback)(char*)) { ... }
Вот это я на рефакторил... Спасибо green, извини что отвлек таким тупняком. Я от безысходности нарыл в wine восстановленные исходники функции __unDNameEx из msvcrt.dll и на основе ее написал тулзу - которая мне показала, что за баг в линкере Выкладываю ее с сорсами, может кому пригодится: http://www.games4free.ru/files/msmangle.zip. Тема закрыта.