移植alsa-lib遇到的问题

linux audio    alsa lib    VERSIONED_SYMBOLS

这两天移植alsa lib时遇到了一个问题,被困住了好久。

做个记录,以后再被同样问题困住。

问题背景是这样的,有个项目,客户要求使用新的alsa-lib库。

到alsa官网上看了下,最新的是1.0.28。

既然可以要用新的,咱们就彻底满足客户,用个最新的。

接下来看看遇到了什么问题。

其实项目中以前也有alsa lib库,毕竟alsa是目前linux系统普遍采用的音频架构。

移植起来其实也没什么麻烦的。

首先,代码搞过来。

然后,执行configure,来生成一堆东东,其中最重要的一个是config.h文件。

一般linux下,应用程序或应用层的库文件,接下来就是make 和make install。

由于我们系统中有自己的make 脚本,所以这两步被我们自己的make 命令所替代。

第一个遇到的问题是:

externals/alsa-lib/src/alisp/alisp.c: In function ‘obj_type_str‘:

externals/alsa-lib/src/alisp/alisp.c:1028:1: error: control reaches end of non-void function [-Werror=return-type]

看错误提示可以知道,这是一个类型非void的函数没有返回值。

但是从[-Werror=return-type]可知,这其实是一个 warning,只是被作为error对待了。

为什么会被作为error对待,因为有-Werror=return-type的配置。

在locl compile flag中,加入-Wno-error=return-type,问题解决。

上面这个问题很快被消灭,下面这个问题则费了我不是血。

问题提示:

/ld: failed to set dynamic section sizes: Bad value

编译是我的弱项,一见到编译问题,就感觉束手无策。

其实万果皆有因。没有无缘无故的错误。

先看了下error之前的编译log,没发现有用的信息。

接下来找度娘帮忙。

也有人遇到过类似问题,看到的一个该问题的解决方案是,其代码中有个函数声明了但没定义,导致了该问题,加上该函数定义,问题解决。

alsa lib的代码不是我写的,有没有声明了但没定义的函数,我也不知道。

alsa lib库的代码量也很可观,检查一遍只能是想想而已。

检查编译log,发现开始有很多warning提示一些宏重复定义了。

通过#ifndef,将这些warning解决。

编译还是有同样的问题。

编译log中还有一些函数参数未被使用的warning,找到这些函数看了下,没发现函数实现有哪个函数没定义(对应前面网上的解决方案)。

是不是在configure的时候有些参数指定的不对,导致有问题?

网上搜了搜别人的移植案例,没发现与我的配置不一致的地方。

既然configure的一个重要功能是生成config.h文件,那就比较下新生成的config.h文件与之去workable版本的config.h文件有什么区别。

比较发现,还是有不少区别。

先用旧的config.h替换过来。

make,通过了!!!

肯定是config.h的问题了。

通过逐类排除,最后发现新的config.h中多了个以下定义:

/* compiled with versioned symbols */

#define VERSIONED_SYMBOLS /**/

把该定义删除,编译就ok了。

用百度搜索该宏,发现有人已经遇到过同样的问题(度娘还是有两下子的):

http://www.android100.org/html/201409/16/65158.html

看到该定义,想起来编译错误之前有一句提示:

libasound.so: version node not found for symbol [email protected]@ALSA_0.9.3

不过,度娘也只有两下子。

想看看VERSIONED_SYMBOLS的说明,还得靠谷歌。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0206j/Beijfhhg.html

You can add specially-named symbols to input objects that cause the linker to create symbol versions. These symbols are of the form:

[email protected] for a non-default version of a symbol

[email protected]@version for a default version of a symbol.

You must define these symbols, at the address of the function or data, as that you want to export. The symbol name is divided into two parts, a symbol name name and a version definition version. The name is added to the dynamic symbol table and becomes part
of the interface to the shared object. Version creates a version called ver if it does not already exist and associates name with the version called ver.

For more information on how to create version symbols, see:

Adding symbol versions in the Compiler User Guide

Chapter 2 Writing ARM Assembly Language in the Assembler Guide.

Example 4.6 places the symbols [email protected],[email protected]@ver2, and
[email protected]@ver1 into the object symbol table:

Example 4.6. Creating versioned symbols, embedded symbols

int old_function(void) __asm__("[email protected]");

int new_function(void) __asm__("[email protected]@ver2");

int other_function(void) __asm__("[email protected]@ver1");

The linker reads these symbols and creates version definitions ver1 and ver2. The symbol foo is associated with a non-default version of ver1, and with a default version of ver2. The symbol bar is associated with a default version of ver1.

估计alsa lib中并没有定义[email protected]和[email protected]@ver2类似的东东,所以出现了前面的错误。

解决办法即删除:

#define VERSIONED_SYMBOLS

There is no way to create associations between versions with this method.

时间: 2024-11-10 11:26:32

移植alsa-lib遇到的问题的相关文章

Arm-Linux 移植 alsa

背景: ALSA是Advanced Linux Sound Architecture的缩写,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持 理论知识:    1.人的声音是模拟信号(连续)-->声音需要经过采样-->量化-->编码 采样:将连续的信号间隔固定的时间去采集一个样本    理论上来说,我们会理所当然的认为采集的样本越多,声音越真实,实际上科学家发现

ALSA lib基本概念

1.channel 通道,即我们熟知的声道数.左/右声道,5.1channel等等 2.sample A sample is a single value that describes the amplitude of the audio signal at a single point in time, on a single channel. sample即一次采样,通常的sample bit指的是一个channnel上,一次采样的bit数(常见的sample bit 8/16/24/32b

Mplayer 在at9g45上的移植步骤

Mplayer 移植步骤 系统芯片为atsam9g45 一 下载 libmad-0.15.1b.tar.gz 和 MPlayer-1.0rc2.tar.bz2 二 安装libmad 解压 libmad-0.15.1b.tar.gz 在任意文件夹, 1  cd libmad-0.15.1b 2 ./configure  --prefix=/tmp/mplayer  --enable-fpm=arm --host=arm-linux  --disable-debugging  --enable-sh

基于tiny6410的madplay播放器的移植

在移植madplay之前需要先将所需要的库移植到开发板的文件系统中. 现在每个解压后的文件夹中创建一个文件夹 zlib-1.1.4.tar.gz 解压:tar xvzf  zlib-1.1.4.tar.gz cd zlib-1.1.4 mkdir __install 配置:./configure --shared --prefix=$(PWD)/__install 修改Makefile文件  将编译器更换为交叉工具 make make install 拷贝 __install/lib/* 到开发

ALSA driver--PCM

在介绍PCM 之前,我们先给出创建PCM实例的框架. #include <sound/pcm.h> .... /* hardware definition */ static struct snd_pcm_hardware snd_mychip_playback_hw = { .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMA

基于ALSA的WAV播放和录音程序

http://blog.csdn.net/azloong/article/details/6140824 这段时间在探索ALSA架构,从ALSA Core到ALSA Lib,再到Android Audio System.在看ALSA Lib时,写了一个比较典型的基于ALSA的播放录音程序.程序包包含四个部分: WAV Parser是对WAV文件的分析和封装,这里只针对Standard WAV File: SND Common是Playback 和Record共同操作,如SetParams.Rea

alsa wav

这段时间在探索ALSA架构,从ALSA Core到ALSA Lib,再到Android Audio System.在看ALSA Lib时,写了一个比较典型的基于ALSA的播放录音程序.程序包包含四个部分:WAV Parser.SND Common.Playback和Record.WAV Parser是对WAV文件的分析和封装,这里只针对Standard WAV File:SND Common是Playback 和Record共同操作,如SetParams.ReadPCM和WritePCM等:Pl

linux alsa pcm(此pcm非硬件pcm接口)

转:https://blog.csdn.net/crycheng/article/details/7095899 CODEC :音频芯片的控制,比如静音.打开(关闭)ADC(DAC).设置ADC(DAC)的增益.耳机模式的检测等操作.I2S   :数字音频接口,用于CPU和Codec之间的数字音频流raw data的传输.每当有playback或record操作时,snd_soc_dai_ops.prepare()会被调用,启动I2S总线.PCM   :我不知道为什么会取这个模块名,它其实是定义

嵌入式行业入门指导---知乎转载【转】

此文是本人在知乎上看的,觉得很好就分享出来了,并不是本人原创 转自:https://www.zhihu.com/question/47881392 作者:shang链接:https://www.zhihu.com/question/47881392/answer/146734937来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 嵌入式Linux+Android学习路线图作者:韦东山 本文目录1. 程序员的三大方向 1.1 专业领域 1.1.1 学术研究 1.1.2