Как заставить VS2013 прекратить генерировать вызовы к __dtol3, __dtoui3 и другим функциям для приведения между целочисленными типами?

Я нахожусь в процессе обновления проекта Visual Studio 2010, предназначенного для RTOS INtime. Код, который выполняет операции приведения, не может связать. При исследовании выходных файлов "встроенной сборки" выясняется, что для некоторых операций приведения целых чисел VS2013 генерирует инструкции сборки для вызовов __dtol3, __dtoui3, __dtoul3, __ltod3 и __ultod3. Проблема в том, что библиотеки INtime не содержат определений для этих функций. Я проверил, что VS2013 делает то же самое для целей Win32 для сборок Debug и Release.

Есть ли способ заставить VS2013 прекратить генерировать вызовы этих функций?

2 ответа

Решение

Вам нужно будет отключить кодер SSE2, используя параметр /arch (используйте либо /arch:IA32, либо /arch:SSE).

В качестве альтернативы...(дальнейшие действия официально не поддерживаются; пробег может отличаться; делайте это на свой страх и риск)

Извлеките из msvcrt.lib объект, который определяет эти функции, и свяжите этот объект непосредственно с вашей программой. Эти функции определены в объекте с именем ftol3.obj; Вы можете извлечь его с помощью инструмента lib:

=>lib /nologo /list msvcrt.lib | findstr ftol3
f:\binaries\Intermediate\vctools\crt_bld\SELF_X86\crt\prebuild\INTEL\dll_lib\ftol3.obj

=>lib /nologo /extract:f:\binaries\Intermediate\vctools\crt_bld\SELF_X86\crt\prebuild\INTEL\dll_lib\ftol3.obj msvcrt.lib

Вам могут понадобиться дополнительные объекты, в зависимости от того (а) какие функции вы используете и (б) что именно определяют библиотеки INtime. Опять же, это не поддерживаемый способ использования библиотек времени выполнения Visual C++, и он может работать или не работать в вашем конкретном случае использования.

возможно, другой путь:

добавить опцию компиляции/d2noftol3

эта опция недокументирована

Попробуйте создать один из них __dtol3, __dtoui3, __dtoul3, __ltod3, and __ultod3, например

extern "C" unsigned int _dtoui3(const double x) {
     return (unsigned int) _mm_cvttsd_si32 (_mm_set_sd(x));
}

Сделать функцию внешне видимой и реализовать в одном файле.

Некоторая информация

Другие вопросы по тегам