2

这是一个简单的 C++ 代码,我在 Windows 8.1 64 位Intel 内核 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 位编译器一起正常工作。

此外,当我将数据类型更改为float时,它在 32 位和 64 位计算机上都可以正常工作。

这里有什么问题?

4

1 回答 1

1

问题如下:

它是在 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的旧数学库。

因此,在使用Process Explorer时,发现 main.exe正在-lm使用似乎不兼容的相应旧libm5.dll 。-L"C:\Program Files (x86)\GnuWin32\lib"

因此,如果至少有一个选项 -lmor-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,因此运行正常。

于 2015-12-01T13:26:12.897 回答