浮点数例外 Floating Point Exception

最近由于需要在重用老版本的服务器,所以需要将原有的服务编译一份运行在老版本服务器上,以下就称老版本服务器为服务器。

于是首先找到REHL5.3的32为系统安装环境,当把执行文件放到服务器上编译运行出现“Floating Point Exception”(浮点数例外)的错误,于是在网上大致可以查到两种情况。

1、高版本GCC编译的程序在低版本GCC的环境下运行会出现这个错误;

2、程序中出现除0的情况,这种情况可用GDB调试找到问题代码,这里就不赘述了;

 例:

int a = 100,b = 0;
a = a/b;

 

好了开始看我的问题。

首先,我得到程序在其他机器上编译时运行没有什么问题,所以可以排除第二种情况,现在专心看第一种情况,先查看一下服务器和编译环境的g++版本的差异编译环境GCC版本:

浮点数例外 Floating Point Exception_第1张图片

同样的命令服务器GCC版本却是gcc version 3.4.5 20051201

可见,这应该是在第一种情况,所以根据网上的说法加上一个编译选项-Wl, --hash-style=sysv(这个选项不知道从哪个版本开始支持的,我只知道我的服务器不支持这个选项^_^,应该是版本太老了吧,这个版本还没改浮点数算法呢),放到服务器上运行使用ldd查看执行程序的依赖是否完整,这时候发现一个问题

ldd: warning: you do not have execution permission for `./libmysqlclient.so.15'
./libmysqlclient.so.15: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by ./libmysqlclient.so.15)

好吧,用strings /lib/libc.so.6 |grep GLIBC看看支持的版本:

[root@localhost ~ ]# strings /lib/libc.so.6 |grep GLIBC
GLIBC_2.0
GLIBC_2.1
GLIBC_2.1.1
GLIBC_2.1.2
GLIBC_2.1.3
GLIBC_2.2
GLIBC_2.2.1
GLIBC_2.2.2
GLIBC_2.2.3
GLIBC_2.2.4
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_PRIVATE
[root@localhost ~ ]#

果然不支持GLIBC_2.4',这样不行好吧我换一个同版本的编译环境(^_^我承认我是懒了)

我果断把代码考到和服务器系统相同版本Linux系统上然后编译,编译完成后首先在编译环境运行,令人意外的情况是,这次在编译环境运行也出现了浮点数例外的错误。

好吧,这个需要一个一个库去找原因,于是写了一个test程序,使用gcc将一个个库文件逐个链接进来,(我在test中没用到对应的库文件的函数,仅仅是链接,因为我的代码在其他机器上跑起来没什么问题,所以我暂时还不回怀疑到代码的错误),然后尝试运行,终于找到一个线程池的库,在test连接到这个库后,运行会报浮点数错误,所以我得检查一下这个库的编译脚本(因为我没用到库的具体代码,所以不需要检查代码),果然,发现在编译脚本中发现在编译库文件以前是没有清除掉上次编译的*.o文件的,因为我的代码是从上一个编译环境拷贝过来的,上个编译环境已经编译过一次,所以*.o文件还存在,然后在这个环境重新编译时编译器直接连接到上一个编译器生成的*.o文件,导致运行错误。好吧,问题找到了,make clean再make,完成。

你可能感兴趣的:(C/C++,编译,编译器,linux,gcc)