ubuntu64位(x86)下科大讯飞sdk使用注意事项

appleyuchi@Ubuntu16:~/demo$ gcc demo.c

/tmp/cc1yENlA.o:在函数‘get_grammar_id’中:
demo.c:(.text+0x146):对‘MSPUploadData’未定义的引用
/tmp/cc1yENlA.o:在函数‘run_asr’中:
demo.c:(.text+0x42b):对‘QISRSessionBegin’未定义的引用
demo.c:(.text+0x502):对‘QISRAudioWrite’未定义的引用
demo.c:(.text+0x597):对‘QISRAudioWrite’未定义的引用
demo.c:(.text+0x5ec):对‘QISRGetResult’未定义的引用
demo.c:(.text+0x72f):对‘QISRSessionEnd’未定义的引用
/tmp/cc1yENlA.o:在函数‘main’中:
demo.c:(.text+0x78a):对‘MSPLogin’未定义的引用
demo.c:(.text+0x885):对‘MSPLogout’未定义的引用

collect2: error: ld returned 1 exit status



以上原因是,虽然asr_sample.c中修改了包含的.h文件的路径,虽然修改准了,还是会报错,这是因为,头文件中只有声明定义,但是没有具体的函数体。

首先注意科大讯飞的官方sdk导入说明:

http://doc.xfyun.cn/msc_linux/412396

*********************************************************************为了方便阅读,罗列如下*********************************************************************:

SDK导入

  • Step 1: 新建工程文件夹
    在当前目录建立一个新目录demo:$ mkdir demo。

  • Step 2:配置工程属性

  1. 将SDK中bin,include,libs文件夹复制到新建工程“Demo”文件夹下

  2. 在demo目录新建文件demo.c,详细源码请参开samples中对应的语音示例

  3. 在demo目录下,创建Makefile文件,具体参见samples下的Makefile,修改路径和目标文件即可

  4. 将samples目录下“32bit_make.sh”文件或者“64bit_make.sh”文件拷到demo目录下,修改libmsc.so库搜索路径

  5. cd到demo目录下,执行“source 32bit_make.sh”或者 “source 64bit_make.sh”完成编译

  6. cd到bin目录下运行目标文件,SDK启动后,bin/msc目录下会生成日志(注意:msc文件夹下需有msc.cfg文件)



*********************************************************************

总结下,上面的sdk导入关键步骤,需要修改路径的地方有三处:

1,64bit_make.sh中的libmsc.so文件路径

2,demo.c中

#include "./include/qisr.h"
#include "./include/msp_cmn.h"
#include "./include/msp_errors.h"

这三个路径都要改

3,Makefile中

DIR_INC = ./include
DIR_BIN = ./bin
DIR_LIB = ./libs
TARGET = demo


注意事项:

讯飞的技术支持mm说最好是x86

所以uname -a先下自己的平台是什么:

Linux Ubuntu16 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb 5 09:39:57 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux


流程和原理(这个还是要记录下,方便以后出问题时debug):

如果有大二的C语言基础,那么知道#include是用来包含外部头文件的,这个好理解,但是讯飞给的三个头文件中没有具体的函数实现,这些函数实现都在libmsc.so文件中。

所以根据上面一句话,可以理解需要修改上面提到的第1,2两点,由于不同的机器运行环境不一样,demo按照官方文档弄好后,还需要运行makefile文件


所以流程总结:

一、根据官方文档(也就是上面的*之间的流程)先把流程走一遍

二、走完流程后,请再次检查上面三点以及注意事项中的平台(路径中尽量不要有中文)。

三、运行前,我的当前路径下的文件有(请查一遍):

appleyuchi@Ubuntu16:~/demo$ ls
64bit_make.sh  bin  demo.o  include  libs  Makefile

上面字体加粗的是文件夹,其他的是单个文件,在当前路径下,运行方法如下:

1、source 64bit_make.sh

2、make(会自动执行当前路径下的Makefile中的命令)

3、

先cd bin

然后./demo(注意demo(没有后缀)在bin文件夹下面,运行方式不是"gcc/g++/clang   demo.c",也不是下载个linux下面的C++编译器来运行,都不是)



我的运行过程如下:

appleyuchi@Ubuntu16:~/demo$ source 64bit_make.sh 
gcc -c -g -Wall -I./include demo.c -o demo.o
gcc -g -Wall -I./include demo.o -o bin/demo -L./libs/x64 -lmsc -lrt -ldl -lpthread
appleyuchi@Ubuntu16:~/demo$ make
make: 'bin/demo' is up to date.
appleyuchi@Ubuntu16:~/demo$ 


注意,如果直接用IDE(例如clion、Codeblocks等)运行demo.c(也就是asr_sample.c)会出现开头的报错:不要依赖IDE。

appleyuchi@Ubuntu16:~/demo$ gcc demo.c

/tmp/cc1yENlA.o:在函数‘get_grammar_id’中:
demo.c:(.text+0x146):对‘MSPUploadData’未定义的引用
/tmp/cc1yENlA.o:在函数‘run_asr’中:
demo.c:(.text+0x42b):对‘QISRSessionBegin’未定义的引用
demo.c:(.text+0x502):对‘QISRAudioWrite’未定义的引用
demo.c:(.text+0x597):对‘QISRAudioWrite’未定义的引用
demo.c:(.text+0x5ec):对‘QISRGetResult’未定义的引用
demo.c:(.text+0x72f):对‘QISRSessionEnd’未定义的引用
/tmp/cc1yENlA.o:在函数‘main’中:
demo.c:(.text+0x78a):对‘MSPLogin’未定义的引用
demo.c:(.text+0x885):对‘MSPLogout’未定义的引用

collect2: error: ld returned 1 exit status



也就是说,多种原因都可能出现以上这种报错:

1、64bit_make.sh中的LD_LIBRARY_PATH路径没改好

2、误用IDE运行(codeblocks、clion、vscode等)

3、误用gcc、clang、g++直接运行(缺少大量运行选项)asr_sample.c文件

4、其他原因




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值