C++ 链接器:“链接器”__fltused”的英文缩写;如果不使用',则为乘法定义;不要在程序中使用浮点

C++ 链接器:“链接器”__fltused”的英文缩写;如果不使用',则为乘法定义;不要在程序中使用浮点,c++,visual-studio,linker,sdl-2,C++,Visual Studio,Linker,Sdl 2,完整的输出是这样的(只有一个错误),发布版本似乎没有遇到同样的问题 SDL2.lib(SDL_stdlib.obj) : error LNK2005: __fltused already defined in LIBCMTD.lib(fltused.obj)` 我已经用/MTd和将SDL2.lib重新编译为一个静态库,并确保它是我的系统中唯一的同名库 不过,这有点奇怪:在我的程序中的任何位置放置浮点操作都可以让它毫无问题地链接: int main(int argc, char * argv[]

完整的输出是这样的(只有一个错误),发布版本似乎没有遇到同样的问题

SDL2.lib(SDL_stdlib.obj) : error LNK2005: __fltused already defined in LIBCMTD.lib(fltused.obj)`
我已经用/MTd和将SDL2.lib重新编译为一个静态库,并确保它是我的系统中唯一的同名库

不过,这有点奇怪:在我的程序中的任何位置放置浮点操作都可以让它毫无问题地链接:

int main(int argc, char * argv[]) {
    return 0;  // will not link
}

int main(int argc, char * argv[]) {
    float flt = 0.0f; // gets around optimization
    return int(flt); // will link
}

当然,这并不理想,这里的根本问题是什么?

你可以试试这个,根据我的记忆,这个问题可以解决

#ifdef __cplusplus 
extern "C" { 
#endif 
int __fltused=0; 
#ifdef __cplusplus 
} 
#endif

问题在于SDL2是如何编译的


仅使用用于静态链接的/MTd或/MT开关编译库是不够的。该库还需要在编译过程中定义_LIBC,以便它能够正确地静态链接到C运行时。

这表明您正在链接到多个版本的C运行时库。您说过您用/MTd重新编译了SDL2.lib;你的应用程序是用什么编译的?它也应该用/MTd编译。@CodyGray-yes,SDL2和我的可执行文件都是/MTd用于调试,/MT用于发布,我进行了三次检查,因为这似乎是最常见的原因,这是唯一可能的原因。CRT是定义
\u fltused
符号的部件。您是否正在链接可能使用不同版本的运行库编译的任何其他LIB文件?@CodyGray-我的其他LIB是
OpenGL32.LIB;glu32.lib;winmm.lib;imm32.lib;version.lib不幸的是。。。所以我不知所措。不知道为什么使用浮动会允许它链接