5 c++ linker visual-studio-2005
因此,在工作中,我正在开发一个无需 C++ 运行时库即可运行的 C++ 应用程序。我们使用的是 Visual Studio 2005,并指定了 /NODEFAULTLIB 开关。
该解决方案的组织方式包括各种静态库项目,然后是使用这些库的单个可执行项目。这些库大多是在单独的存储库中跟踪的常见库。它们可以改变,但如果可以避免的话,我们最好不要改变。
这些常见库之一使用浮点数学。由于我们没有 C++ 运行时,因此我们自己定义了这些例程(例如:_ftol2_sse用于将 float 转换为 int)。
根据我对底层细节的(相当有限的)理解,编译器发出_fltused需要使用浮点数学例程的符号信号。
由于某种原因,其他公共库之一决定手动定义此符号,如
extern "C" { unsigned short _fltused = 0; };
Run Code Online (Sandbox Code Playgroud)
当我启用整个程序优化和链接时代码生成时,我得到
warning C4743: '_fltused' has different size ...
Run Code Online (Sandbox Code Playgroud)
链接时。我不知道为什么我们将其声明为unsigned short而不是int,但事实就是这样。
当我不启用整个程序优化或 LTCG 时,警告就会消失。
我想我有两个问题。
更新
我找到了该代码的原始作者,他承认这是从汇编语言重写代码时出现的错误。他同意我的观点,即该警告是无害的,因为_fltused从未实际直接使用过。
我想我至少可以回答2个。这并不是进行任何具体的优化。事实上,整个程序优化迫使编译器保留整个程序的某些表示形式可供优化,并且根据该中间表示形式,它能够确定同一变量具有不同的大小。当未启用整个程序优化时,编译器仅单独查看每个源文件,而不会看到两个不同的文件为该符号定义了不同的类型。
综上所述,我 99% 确定您的程序违反了一条定义规则:“未定义的行为,无需诊断”。如果你有机会修复它,你应该修复它,防止像编译器补丁破坏你的代码这样简单的事情。