Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
От: sandrey_  
Дата: 07.03.13 06:40
Оценка: -1
Здравствуйте.

Есть у меня проект. Написан на чистом 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
От: okman Беларусь https://searchinform.ru/
Дата: 07.03.13 07:04
Оценка:
Здравствуйте, 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
От: sandrey_  
Дата: 07.03.13 07:09
Оценка:
Здравствуйте, 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
От: okman Беларусь https://searchinform.ru/
Дата: 07.03.13 07:23
Оценка:
Здравствуйте, sandrey_, Вы писали:

_>Да, я прочитал вот тут

_>http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvc/thread/a51fe950-cd74-4133-8d84-1bc07b353bc2/
_>про отключение оптимизации. Отключал. Не помогает.

Вот минимальный пример:
#include <Windows.h>

int main()
{
    BYTE Buff[1000];
    int i;
        
    for (i = 0; i < 1000; ++i)
    {
        Buff[i] = 3;
    }
                            
    return Buff[1];
}

Настройки сборки VC++ 2010:
/Ox (Full Optimization), /GS- (Buffer Security Check = No), /TC (Compile as C code),
/NODEFAULTLIB (Ignore All Default Libraries), EntryPoint = main.

Вылетает ошибка: неразрешенный символ _memset.

Когда меняю /Ox на /Od (Optimization: Disabled), все собирается успешно.
Re[4]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
От: sandrey_  
Дата: 07.03.13 07:41
Оценка:
У меня, видимо, не в оптимизации дело. :-(

Вот мои командные строки
— для "С/С++":

/Zi /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /GF /Gm- /MT /Zp4 /GS- /Gy- /fp:precise /fp:except- /Zc:wchar_t /Zc:forScope /GR- /openmp- /Fp"Release\ccron.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /TC /analyze- /errorReport:queue


— для "Компоновщика":

/OUT:"MyApp.exe" /INCREMENTAL:NO /NOLOGO "kernel32.lib" "user32.lib" "advapi32.lib" "Shell32.lib" "winmm.lib" "../llmul.obj" "../lldiv.obj" "../llshl.obj" /NODEFAULTLIB /MANIFEST:NO /ManifestFile:"MyApp.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /PDB:"MyApp.pdb" /SUBSYSTEM:WINDOWS /TSAWARE:NO /OPT:REF /OPT:ICF /PGD:"MyApp.pgd" /TLBID:1 /ENTRY:"Main" /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE
Re[5]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
От: okman Беларусь https://searchinform.ru/
Дата: 07.03.13 08:00
Оценка:
Здравствуйте, sandrey_.

Как вариант, можно написать свою реализацию memset, тогда компилятор будет подставлять ее.
Re[5]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
От: acDev Россия  
Дата: 07.03.13 14:00
Оценка:
Здравствуйте, sandrey_, Вы писали:

Функция _memset живёт в каком то оъектном файлике, типа "../memcpy.obj" (глянуть не могу, т.к. нету под рукой студии).
Можно самому сделать так:
#define _memset(_Src, _Val, _Size) __stosb((PUCHAR)(_Src), (UCHAR)(_Val), (SIZE_T)(_Size))
только intrin.h не забудьте подлючить.
Re[6]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
От: sandrey_  
Дата: 11.03.13 09:10
Оценка:
Здравствуйте, 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
От: acDev Россия  
Дата: 11.03.13 09:34
Оценка:
Здравствуйте, 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
От: sandrey_  
Дата: 11.03.13 10:21
Оценка:
Здравствуйте, acDev, Вы писали:

D>Попробуйте подключить к проекту: \VC\lib\msvcrt.lib (или libcmt.lib)

D>Если юзаются COS,SIN,SQRT и т.п., то и на них будет ругаться далее.

Вы предлагаете подключить CRT к проекту без CRT. Не получится.
Линковщик будет ругаться на main,__tmainCRTStartup и т.п.


http://www.rsdn.ru/article/cpp/crt.xml
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.

В этой статье рекомендуют написать
extern "C" int _fltused = 0;

Да, так все компилируется, но при запуске программа падает с каким-то исключением в модуле ntdll.dll...
Еще где-то советуют подключить ntdll.lib, но в VisualStudio 2010 такого файла нет...
Re[9]: Ошибка при переходе с VisualStudio 2003 на VisualStudio 2010
От: sandrey_  
Дата: 12.03.13 09:33
Оценка:
Здравствуйте, sandrey_, Вы писали:

_>http://www.rsdn.ru/article/cpp/crt.xml
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.

_>В этой статье рекомендуют написать
_>extern "C" int _fltused = 0;

_>Да, так все компилируется, но при запуске программа падает с каким-то исключением в модуле ntdll.dll...

_>Еще где-то советуют подключить ntdll.lib, но в VisualStudio 2010 такого файла нет...

Ошибка оказалась в другом.
От
error LNK2001: неразрешенный внешний символ "__fltused"
действительно можно успешно избавиться, написав
EXTERN_C int _fltused = 0;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.