8

我正在升级针对 INtime RTOS 的 Visual Studio 2010 项目。执行强制转换操作的代码无法链接。在调查“内联汇编”输出文件时,发现对于某些整数转换操作,VS2013 正在生成汇编指令以调用 __dtol3、__dtoui3、__dtoul3、__ltod3 和 __ultod3。问题是 INtime 库不包含这些函数的定义。我已经验证 VS2013 对 Win32 目标的 Debug 和 Release 版本执行相同的操作。

有没有办法让 VS2013 停止生成对这些函数的调用?

4

3 回答 3

15

您需要通过使用/arch选项禁用 SSE2 代码生成(使用 /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

您可能需要其他对象,具体取决于 (a) 您使用的函数和 (b) INtime 库定义的确切内容。同样,这不是使用 Visual C++ 运行时库的受支持方式,它可能适用于您的特定用例,也可能不适用。

于 2013-10-24T03:53:05.700 回答
4

可能是另一种方式:

添加编译选项 /d2noftol3

此选项未记录在案

于 2015-07-29T04:22:32.220 回答
2

尝试创建其中之一__dtol3, __dtoui3, __dtoul3, __ltod3, and __ultod3,例如。

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

使功能在外部可见并在一个文件中实现。

一些信息

于 2019-03-05T21:13:54.273 回答