Добрый вечер, решил использовать динамический импорт и директиву /nodefaultlib для полной минимизации размера модуля.
Все нужные функции импортирую, НО, по непонятным причинам возникает ошибка линковки:
PModule.obj : error LNK2001: unresolved external symbol _memset
Создал маленький проект, туда запихал небольшой код, отказался от црт (/nodefaultlib + /entry:winmain) и все равно возникала эта ошибка! В итоге оказалось, что комментируя WINAPI функцию GetClassName, ошибка исчезала. Возникает ощущение что компилятор сам добавляет memset в проект при определенных условиях. Поэтому вижу только один путь для решения проблемы: описать функцию memset.
При использовании /nodefaultlib, ни одна lib библиотека к проекту не подключается, поэтому таким образом определить memset нельзя. Пробовал прописать напрямую в проекте:
extern "C"
{
void * memset (void *Dst, int Val, size_t Size)
{
return Mmemset(Dst, Val, Size); // импортируемая мною из ntdll функция
}
}
компилятор орет:
error C2169: 'memset' : intrinsic function, cannot be defined
Если указать директиву #pragma intrinsic (memset), то вдобавок к предыдущей ошибке возникает warning C4164: 'memset' : intrinsic function not declared
Отключал использование intrinsic-функций (в настройках проекта и добавлением /Oi-) все равно intrinsic function, cannot be defined! Подскажите пожалуйста как решить проблему.
extern "C" void * __cdecl memset(void * const s, int c, size_t n);
#pragma intrinsic(memset)
Этого должно быть достаточно.
Здравствуйте, byleas, Вы писали:
B>B>extern "C" void * __cdecl memset(void * const s, int c, size_t n);
B>#pragma intrinsic(memset)
B>Этого должно быть достаточно.
недостаточно(
Этой проблеме уже несколько лет.
http://rsdn.ru/forum/cpp.applied/1665635.1.aspxАвтор: MShura
Дата: 07.02.06
RTT>Если указать директиву #pragma intrinsic (memset), то вдобавок к предыдущей ошибке возникает warning C4164: 'memset' : intrinsic function not declared
RTT>Отключал использование intrinsic-функций (в настройках проекта и добавлением /Oi-) все равно intrinsic function, cannot be defined! Подскажите пожалуйста как решить проблему.
Избавиться от всех явных и неявных вызовов memset, заменив эти вызовы на явный вызов своей memset.
Здравствуйте, fkRTTI, Вы писали:
RTT>недостаточно(
...и линкуй с ntdll.lib. Даже если убрать явные вызовы, и заменить их обнулением через for, компилятор вставит вызов memset.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth