当前位置: 首页 > 工具软件 > libmad > 使用案例 >

MIPS移植libmad。解决编译中出现的两个问题

孔冥夜
2023-12-01

MIPS安装这个libmad库就是个坑,不由感慨一句,网上大神还是多。致敬大神的同时,这个方法不能让他淹没下去,我是在犄角旮旯里找到的他。

#tar -zxvf libmad-0.15.1b.tar.gz
#cd libmad-0.15.1b

如果此时直接make,就会出现一系列问题。

#./configure --host=mipsel-linux 
--prefix=/opt/libmad-mipsel 
--enable-fpm=mips

然后make,就会出现第一个报错

Makefile:383:recipe for target 'version.lo' failed
make[2]:*** [version.lo] Error 1
………………

原因不说了,网上多的很,解决方法有两种:
方法一:
修改Makefile

#gedit Makefile

找到-fforce-mem,这个字符串,删除保存
方法二:
在./configure之前,先输入

#sed -i '/-fforce-mem' configure

结果都是一样的,只要不出现这个字符串。
解决了这个问题,我们重新./configure,并make,会出现新的问题。

问题二

大致报错是这样的

synth.c:………………in expansion of macro 'MAD_F_MLX'
fixed.h:………………impossible constraint in 'asm'
………………
Makefile:383:receipe for target 'synth.lo' failed
make[2]:***[synth.lo] Error 1
………………………………

这个问题只出现在MIPS的编译器上,需要修改libmad文件下的两个头文件的代码。

2.1 修改第一个头文件:fixed.h

#gedit fixed.h

Ctrl+F,搜索关键字“MIPS”,有两处修改内容。
找到相关内容,第一处修改内容

#elif defined(FPM_MIPS)   //找到这一段命令,原来就有,在这回车,在下面添加命令

//以下为添加的内容
/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */
#if defined (__GNUC__) && defined (__GNUC_MINOR__)
#define __GNUC_PREREQ(maj, min) \
 ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
#else
#define __GNUC_PREREQ(maj, min)  0
#endif
#if __GNUC_PREREQ(4,4)
  typedef unsigned int u64_di_t __attribute__ ((mode (DI)));
# define MAD_F_MLX(hi, lo, x, y) \
  do { \
      u64_di_t __ll = (u64_di_t) (x) * (y); \
      hi = __ll >> 32; \
      lo = __ll; \
   } while (0) 
#else
//以上内容在此添加

第二处添加内容,紧挨着往下翻,找到这条
if defined(OPT_SPEED)命令,在此条命令,上面添加

#endif            //原有内容
#endif /* __GNU_PREREQ(4,4) */        //添加内容
#if defined(OPT_SPEED)         //原有内容

保存修改,关闭

2.2 修改第二个头文件:mad.h

然后是修改第二个头文件,有两处修改内容
mad.h
同样,Ctrl+F,搜索“MIPS”,找到#elif defined(FPM_MIPS)

# elif defined(FPM_MIPS)    //在下面添加内容
//以下为添加的内容
/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */
#if defined (__GNUC__) && defined (__GNUC_MINOR__)
#define __GNUC_PREREQ(maj, min) \
   ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
#else
#define __GNUC_PREREQ(maj, min)  0
#endif
#if __GNUC_PREREQ(4,4)
  typedef unsigned int u64_di_t __attribute__ ((mode (DI)));
# define MAD_F_MLX(hi, lo, x, y) \
   do { \
      u64_di_t __ll = (u64_di_t) (x) * (y); \
      hi = __ll >> 32; \
     lo = __ll; \
  } while (0) 
 #else
 //以上为添加的内容

然后是第二处修改,紧挨着往下翻,找到if defined(OPT_SPEED)命令,在此条命令,上面添加。

#endif            //原有内容
#endif /* __GNU_PREREQ(4,4) */        //添加内容
#if defined(OPT_SPEED)         //原有内容

保存后关闭。

至此,问题解决了。
重新配置,make,make install。成功。

 类似资料: