Есть у меня проект. Написан на чистом WinAPI (только C, без классов, без CRT) в VisualStudio 2003. Там он замечательно компилируется.
Хочу внести в него изменения, но уже в VisualStudio 2010. Проблема на первом же шаге: открываю этот проект в 2010-м, он конвертируется из 2003-ого, компилирую... и получаю ошибку:
app.obj : error LNK2019: ссылка на неразрешенный внешний символ _memset в функции _MyFunc@0
memset ни в MyFunc, ни вообще нигде в проекте нет — я ее нигде не вызываю (она же из CRT, вроде). Я использую HeapAlloc, lstrcpy и т.п. (как я писал у меня только C, только WinAPI, без CRT).
Где он эту memset взял? Что делать? В 2003-ем-то тоже самое компилируется без проблем.
Re: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
Здравствуйте, sandrey_, Вы писали:
_>Есть у меня проект. Написан на чистом WinAPI (только C, без классов, без CRT) в VisualStudio 2003. Там он замечательно компилируется. _>Хочу внести в него изменения, но уже в VisualStudio 2010. Проблема на первом же шаге: открываю этот проект в 2010-м, он конвертируется из 2003-ого, компилирую... и получаю ошибку:
_>app.obj : error LNK2019: ссылка на неразрешенный внешний символ _memset в функции _MyFunc@0
_>memset ни в MyFunc, ни вообще нигде в проекте нет — я ее нигде не вызываю (она же из CRT, вроде). Я использую HeapAlloc, lstrcpy и т.п. (как я писал у меня только C, только WinAPI, без CRT).
_>Где он эту memset взял? Что делать? В 2003-ем-то тоже самое компилируется без проблем.
Может быть, используются макросы (Rtl)ZeroMemory ?
А еще вполне вероятно, что вызов memset вставляется компилятором в процессе оптимизации, я
такое поведение встречал на Visual C++ 2010, обычно лечится отключением оптимизации.
Re[2]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
Здравствуйте, okman, Вы писали:
O>Может быть, используются макросы (Rtl)ZeroMemory ?
Нет.
O>А еще вполне вероятно, что вызов memset вставляется компилятором в процессе оптимизации, я O>такое поведение встречал на Visual C++ 2010, обычно лечится отключением оптимизации.
Да, я прочитал вот тут http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvc/thread/a51fe950-cd74-4133-8d84-1bc07b353bc2/
про отключение оптимизации. Отключал. Не помогает.
Re[3]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
Функция _memset живёт в каком то оъектном файлике, типа "../memcpy.obj" (глянуть не могу, т.к. нету под рукой студии).
Можно самому сделать так:
#define _memset(_Src, _Val, _Size) __stosb((PUCHAR)(_Src), (UCHAR)(_Val), (SIZE_T)(_Size))
только intrin.h не забудьте подлючить.
Re[6]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
Здравствуйте, acDev, Вы писали: D>Можно самому сделать так: D>#define _memset(_Src, _Val, _Size) __stosb((PUCHAR)(_Src), (UCHAR)(_Val), (SIZE_T)(_Size))
В общем, так я и не смог заставить компилятор не вставлять вызов этой memset куда попало.
#define не помог почему-то — так же ошибка.
Просто написал свою memset. Точнее взял то, что было в VC\crt\src\memset.c. Ошибка исчезла.
Но у меня теперь другая проблема:
error LNK2001: неразрешенный внешний символ "__fltused"
Как эту штуку побороть? Тип float я использую в паре мест всего — есть api-шные функции, которые его хотят в качестве параметра.
Re[7]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
Здравствуйте, sandrey_, Вы писали:
_>Просто написал свою memset. Точнее взял то, что было в VC\crt\src\memset.c. Ошибка исчезла.
Нужно было просто в проект добавить файлик: \VC\crt\src\intel\mt_lib\memset.obj
_>Но у меня теперь другая проблема: _>error LNK2001: неразрешенный внешний символ "__fltused"
Попробуйте подключить к проекту: \VC\lib\msvcrt.lib (или libcmt.lib)
Если юзаются COS,SIN,SQRT и т.п., то и на них будет ругаться далее.
_>Тип float я использую в паре мест всего — есть api-шные функции, которые его хотят в качестве параметра.
И что же это за функции?
Re[8]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
Здравствуйте, acDev, Вы писали:
D>Попробуйте подключить к проекту: \VC\lib\msvcrt.lib (или libcmt.lib) D>Если юзаются COS,SIN,SQRT и т.п., то и на них будет ругаться далее.
Вы предлагаете подключить CRT к проекту без CRT. Не получится.
Линковщик будет ругаться на main,__tmainCRTStartup и т.п.
В этой статье рекомендуют написать
extern "C" int _fltused = 0;
Да, так все компилируется, но при запуске программа падает с каким-то исключением в модуле ntdll.dll...
Еще где-то советуют подключить ntdll.lib, но в VisualStudio 2010 такого файла нет...
Re[9]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
_>В этой статье рекомендуют написать _>extern "C" int _fltused = 0;
_>Да, так все компилируется, но при запуске программа падает с каким-то исключением в модуле ntdll.dll... _>Еще где-то советуют подключить ntdll.lib, но в VisualStudio 2010 такого файла нет...
Ошибка оказалась в другом.
От
error LNK2001: неразрешенный внешний символ "__fltused"
действительно можно успешно избавиться, написав
EXTERN_C int _fltused = 0;