LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3554|回复: 15

请问这是什么问题呢:链接第三方程序库时出错说浮点类型不匹配

[复制链接]
发表于 2006-11-30 12:26:49 | 显示全部楼层 |阅读模式
我们在程序中用到第三方的函数,所以需要链接第三方厂商提供的程序库(-l3rdPartyLib),但是在链接时交叉编译器报错,说libgcc.a中的一些文件使用的浮点类型与我们自己程序(object)使用的浮点类型不匹配。具体信息如下所示:

  1. compiling binary prog1.o ......
  2. arm-linux-gcc -g  -c prog1.c -o prog1.o
  3. compiling binary object.o ......
  4. arm-linux-gcc -g  -c object.c -o object.o
  5. linking object ......
  6. arm-linux-gcc -o target prog1.o object.o -L. -l3rdPartyLib -lm -lpthread  
  7. /usr/local/arm/2.95.3/arm-linux/bin/ld: Error: _fixunsdfsi.o uses hard floating point,
  8. whereas object uses soft floating point
  9. File format not recognized: failed to merge target specific data of file
  10. /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/libgcc.a(_fixunsdfsi.o)
复制代码


请问各位这是什么原因呢?之前因为看到错误信息中有(/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/libgcc.a(_fixunsdfsi.o)),我怀疑是交叉编译器对软浮点不支持的原因,但是自己编写了一个小的含有浮点运算的测试程序用开发板自带现成cross-2.95.3编译器编译之后可以正常运行在开发板上。

所以我就很困惑了——这到底是否是交叉编译器不支持软浮点运算的问题呢?

后来自己手工编译了一个交叉编译器工具链,在编译时添加了一些选项参数(如--with-float=soft,--enable-softfloat等)来支持软浮点运算,但是后来证明次编译器制作的有问题,而且链接第三方程序库时还是有浮点类型不匹配的错误,就没有继续尝试。

现在我自己应该以怎样的思路来解决这个问题了,如果是因为不支持软浮点运算,那为什么可以在开发板上跑浮点运算测试程序呢?如果支持软浮点,为什么libgcc.a中的目标文件为什么总是说使用的是硬浮点呢?请各位高手指点,谢谢~!

附:我们使用的交叉编译环境:
宿主系统:rh9/Ubuntu/Debian都试过了
目标板处理器:ARM9 (s3c2410x) 有mmu  
目标操作系统:mizi 公司的arm linux
交叉编译器:开发板自带的cross-2.95.3
发表于 2006-11-30 17:15:09 | 显示全部楼层
把你的Makefile帖出来瞅瞅先
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-30 19:04:58 | 显示全部楼层
Post by LYOO
把你的Makefile帖出来瞅瞅先


呵呵,就在上面的打印信息里就有啊。

arm-linux-gcc -g -c prog1.c -o prog1.o

arm-linux-gcc -g -c object.c -o object.o

arm-linux-gcc -o target prog1.o object.o -L. -l3rdPartyLib -lm -lpthread

反映到源代码是:

  1. CC = arm-linux-gcc
  2. #OurLib是第三方厂商的程序库
  3. LINK = -L. -lOurLib -lm -lpthread
  4. INCDIR=/path/to/cross/headers
  5. CFLAGS = -g -I$(INCDIR)
  6. OBJS=object.o prog1.o
  7. TAR=test

  8. $(TAR):$(OBJS)
  9.         $(CC) -o $@ $^ $(LINK)
  10. object.o:some dependencies
  11.         $(CC) $(CFLAGS) -c $< -o $@
  12. prog1.o:some dependencies
  13.         $(CC) $(CFLAGS) -c $< -o $@  
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-2 17:04:50 | 显示全部楼层
加上个:
  1. CFLAGS = -msoft-float
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-4 17:29:26 | 显示全部楼层
Post by LYOO
加上个:
  1. CFLAGS = -msoft-float
复制代码


呵呵,这个以前试过,但是会出现这样的错误。改动过后的Makefile:

  1. CC = arm-linux-gcc
  2. #OurLib是第三方厂商的程序库
  3. LINK = -L. -lOurLib -lm -lpthread
  4. INCDIR=/path/to/cross/headers
  5. CFLAGS = -g -msoft-float
  6. OBJS=object.o prog1.o
  7. TAR=test

  8. $(TAR):$(OBJS)
  9.         $(CC) -o $@ $^ -msoft-float $(LINK)
  10. object.o:some dependencies
  11.         $(CC) $(CFLAGS) -c $< -o $@
  12. prog1.o:some dependencies
  13.         $(CC) $(CFLAGS) -c $< -o $@  
复制代码

错误如下所示:

  1. arm-linux-gcc -g -msoft-float  -c prog1.c -o prog1.o
  2. arm-linux-gcc -g -msoft-float  -c object.c -o object.o
  3. arm-linux-gcc -o target prog1.o object.o -msoft-float  -L. -lOurLib -lm -lpthread
  4. /usr/local/arm/2.95.3/arm-linux/bin/ld: cannot find -lfloat
  5. collect2: ld returned 1 exit status
  6. make: *** [sirfapi] Error 1
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-4 18:17:53 | 显示全部楼层
不知道我这样做是否正确,请大家指点。
谢谢~!
回复 支持 反对

使用道具 举报

发表于 2006-12-5 13:37:01 | 显示全部楼层
  1. $(CC) -o $@ $^ -msoft-float $(LINK)
复制代码

这里没必要加,在CFLAG里定义就行了。

我遇到过类似情况,我用的是GNUARM提供的开发包,当我从bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4升级到bu-2.17_gcc-4.1.1-c-c++_nl-1.14.0_gi-6.5,原来写的Makefile编译出错:浮点类型不匹配,所以我在Makefile中做了如下修改强制使用软浮点,就行了。

  1. ......
  2. CFLAGS = [b]-msoft-float[/b] -gdwarf-2 -c -I.\include
  3. ......
  4. ASFLAGS = [b]-mno-fpu[/b] -gdwarf2 -I.\boot
  5. ......
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-6 00:45:18 | 显示全部楼层
Post by LYOO
  1. $(CC) -o $@ $^ -msoft-float $(LINK)
复制代码
这里没必要加,在CFLAG里定义就行了。

我遇到过类似情况,我用的是GNUARM提供的开发包,当我从bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4升级到bu-2.17_gcc-4.1.1-c-c++_nl-1.14.0_gi-6.5,原来写的Makefile编译出错:浮点类型不匹配,所以我在Makefile中做了如下修改强制使用软浮点,就行了。
  1. ......
  2. CFLAGS = [b]-msoft-float[/b] -gdwarf-2 -c -I.\include
  3. ......
  4. ASFLAGS = [b]-mno-fpu[/b] -gdwarf2 -I.\boot
  5. ......
复制代码

多谢LYOO的耐心回复,但是我按照你的方法修改Makefile后,错误依然没有改变。
gdwarf-2 和gdwarf2参数好像在我所使用的arm-linux-gcc中并不支持:
  1. arm-linux-gcc -msoft-float -gdwarf-2 -c  -mno-fpu -gdwarf2 prog1.c -o prog1.o
  2. cc1: Invalid option `no-fpu'
  3. cc1: warning: `-gdwarf2' not supported by this configuration of GCC
  4. make: *** [prog1.o] Error 1
复制代码



修改后的makefile:
  1. CC = arm-linux-gcc
  2. OBJS=object.o prog1.o
  3. LINK = -L. -lOurLib -lm -lpthread
  4. CFLAGS = $(MSF) -c
  5. ASFLAGS = -mno-fpu
  6. TAR = test
  7. $(TAR):$(OBJS)
  8.         $(CC) -o $@ $^ $(LINK)
  9. object.o:some dependencies
  10.         $(CC) $(CFLAGS)  $< -o $@
  11. prog1.o:some dependencies
  12.         $(CC) $(CFLAGS)  $< -o $@  
复制代码

出错信息依旧:
  1. /usr/local/arm/2.95.3/arm-linux/bin/ld: Error: _fixunsdfsi.o uses hard floating point,
  2. whereas object(我的程序) uses soft floating point
  3. File format not recognized: failed to merge target specific data of file
  4. /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/libgcc.a(_fixunsdfsi.o)
  5. /usr/local/arm/2.95.3/arm-linux/bin/ld: Error: _udivsi3.o uses hard floating point,
  6. whereas object(我的程序) uses soft floating point
  7. File format not recognized: failed to merge target specific data of file
  8. /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/libgcc.a(_udivsi3.o)
  9. .......
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-6 09:13:58 | 显示全部楼层
我用的是arm-elf-tools,你用的是arm-linux-tools,难道说两者支持的标签不兼容?-gdwarf2是指定ELF调试信息格式的标签,按理应该没这个问题的。你应该参考一下arm-linux-tools的文档,思路嘛就是手动指定浮点类型。

补充说明一点:
ASFLAGS是针对AS的FLAGS,CFLAGS是针对CC的FLAGS。所以你上面的写法还是有问题的。我按你提供的Makefile修改如下:


  1. CC = arm-linux-gcc
  2. #OurLib是第三方厂商的程序库
  3. LINK = -L. -lOurLib -lm -lpthread
  4. INCDIR=/path/to/cross/headers
  5. CFLAGS = -g -msoft-float -gdwarf-2 -c
  6. ASFLAGS = -mno-fpu -gdwarf2
  7. OBJS=object.o prog1.o
  8. TAR=test

  9. $(TAR):$(OBJS)
  10.         $(CC) -o $@ $^ $(LINK)
  11. object.o:some dependencies
  12.         $(CC) $(CFLAGS) -c $< -o $@
  13. prog1.o:some dependencies
  14.         $(CC) $(CFLAGS) -c $< -o $@  
复制代码


注意,由于不知道你的头文件路径,所在在CFLAGS和ASFLAGS里没有加-Ixxx,你自己酌情添加。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-6 12:37:18 | 显示全部楼层
Post by LYOO
我用的是arm-elf-tools,你用的是arm-linux-tools,难道说两者支持的标签不兼容?-gdwarf2是指定ELF调试信息格式的标签,按理应该没这个问题的。你应该参考一下arm-linux-tools的文档,思路嘛就是手动指定浮点类型。

请问,arm-elf-tools可以用在我们的环境中么?它与arm-linux-tools相比除了程序格式之外还有什么重大的差异么?另外,想问一下,为什么只在编译的时候添加-msoft-float,而在链接的时候却不用呢?

补充说明一点:
ASFLAGS是针对AS的FLAGS,CFLAGS是针对CC的FLAGS。所以你上面的写法还是有问题的。

在makefile中的编译指令(如$(CC) $(CFLAGS) -c $< -o $@)中显式地写出了CFLAGS,那是否还需要显式指明$(ASFLAGS)?可以给出您当时使用的makefile么?
我按你提供的Makefile修改如下:

  1. CC = arm-linux-gcc
  2. #OurLib是第三方厂商的程序库
  3. LINK = -L. -lOurLib -lm -lpthread
  4. INCDIR=/path/to/cross/headers
  5. CFLAGS = -g -msoft-float -gdwarf-2 -c
  6. ASFLAGS = -mno-fpu -gdwarf2
  7. OBJS=object.o prog1.o
  8. TAR=test

  9. $(TAR):$(OBJS)
  10.         $(CC) -o $@ $^ $(LINK)
  11. object.o:some dependencies
  12.         $(CC) $(CFLAGS) -c $< -o $@
  13. prog1.o:some dependencies
  14.         $(CC) $(CFLAGS) -c $< -o $@  
复制代码


注意,由于不知道你的头文件路径,所在在CFLAGS和ASFLAGS里没有加-Ixxx,你自己酌情添加。

谢谢您的修改,我尝试了一下,好像还是不行。我看了一下您换了一下CFLAGS中-c的位置吧。
这个我在实际操作时已经改了,但是在帖子中没写好,不好意思:-)
另外,关于-Ixxx这个参数,我所有私有头文件都在Makefile同级目录下,还需要再指定么?
谢谢~!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表