这里是一个简单的C ++代码,我正在Windows 8.1 64位英特尔核心i-7机器上使用TDM-GCC 5.1 32位 (gcc-5.1.0-tdm-1-core)进行编译。
#include <iostream> #include <cmath> using namespace std; int main() { double a, b; a = 0.002; b = 0.004; cout << std::sqrt(a*a+b*b)<< endl; return 0; }
但在运行时,它会提供以下输出
nan
但是,它在32位机器上与TDM-GCC 32位编译器正常工作。
此外,当我将数据types更改为float时 ,它在32位和64位计算机上都能正常工作。
这里有什么问题?
问题如下:
它使用以下命令(缩小)在Code :: Blocks中固有编译:
g++.exe -L"C:\Program Files (x86)\GnuWin32\lib" -o main.exe main.cpp -lm
其中C:\ Program Files(x86)\ GnuWin32 \ lib有一个名为libm.a的旧数学库。
因此,在-L"C:\Program Files (x86)\GnuWin32\lib"
,使用Process Explorer发现main.exe正在使用相应的旧libm5.dll ,这似乎是不兼容的。
因此,如果至少有一个选项 -lm
或-L"C:\Program Files (x86)\GnuWin32\lib"
被删除并编译如下:
g++.exe -L"C:\Program Files (x86)\GnuWin32\lib" -o main.exe main.cpp
要么
g++.exe -o main.exe main.cpp -lm
要么
g++.exe -o main.exe main.cpp
它不链接旧的libm.a
,因此正确运行。