gsm库(libgsm)在ARM-Linux下的移植

发布者:SparklingSun最新更新时间:2024-11-05 来源: cnblogs关键字:ARM-Linux  移植 手机看文章 扫描二维码
随时随地手机看文章

GSM是常见的VOIP的语音编解码库,在Linux下用libgsm来实现。在项目中需要用到libgsm库。因此试着直接编译GSM库来编译.官网已经停止服务了,因此在这个网址下了最新版来编译

 

解压后发现,这个Makefile是一个手写而非 Autoconf生成的Makefile,并且只有编译静态库,而没有常见的动态库的Makefile.

因此将其修改一下,使用其能在ARM编译并且成动态库。这也是一个典型的Makefile的修改练习,如果想编译成静态库,简单把 LIBEXT 改成 a即可

 

# Copyright 1992-1996 by Jutta Degener and Carsten Bormann, Technische
# Universitaet Berlin.  See the accompanying file 'COPYRIGHT' for
# details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.

# Machine- or installation dependent flags you should configure to port

SASR = -DSASR
######### Define SASR if >> is a signed arithmetic shift (-1 >> 1 == -1)

# MULHACK = -DUSE_FLOAT_MUL
######### Define this if your host multiplies floats faster than integers,
######### e.g. on a SPARCstation.

# FAST = -DFAST
######### Define together with USE_FLOAT_MUL to enable the GSM library's
######### approximation option for incorrect, but good-enough results.

# LTP_CUT = -DLTP_CUT
LTP_CUT =
######### Define to enable the GSM library's long-term correlation
######### approximation option---faster, but worse; works for
######### both integer and floating point multiplications.
######### This flag is still in the experimental stage.

WAV49 = -DWAV49
# WAV49 =
######### Define to enable the GSM library's option to pack GSM frames
######### in the style used by the WAV #49 format.  If you want to write
######### a tool that produces .WAV files which contain GSM-encoded data,
######### define this, and read about the GSM_OPT_WAV49 option in the
######### manual page on gsm_option(3).

# Choose a compiler.  The code works both with ANSI and K&R-C.
# Use -DNeedFunctionPrototypes to compile with, -UNeedFunctionPrototypes to
# compile without, function prototypes in the header files.
#
# You can use the -DSTUPID_COMPILER to circumvent some compilers'
# static limits regarding the number of subexpressions in a statement.

# CC  = cc
# CCFLAGS  = -c -DSTUPID_COMPILER

# CC  = /usr/lang/acc
# CCFLAGS  = -c -O
CROSS           = arm-linux-
CC  = $(CROSS)gcc -ansi -pedantic
CCFLAGS  = -c -O2 -DNeedFunctionPrototypes=1 -fpic

LD   = $(CC)

# LD  = gcc
# LDFLAGS  =


# If your compiler needs additional flags/libraries, regardless of
# the source compiled, configure them here.

# CCINC = -I/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1/include
######### Includes needed by $(CC)

# LDINC = -L/usr/gnu/lib/gcc-2.1/gcc-lib/sparc-sun-sunos4.1.2/2.1
######### Library paths needed by $(LD)

# LDLIB = -lgcc
######### Additional libraries needed by $(LD)


# Where do you want to install libraries, binaries, a header file
# and the manual pages?
#
# Leave INSTALL_ROOT empty (or just don't execute 'make install') to
# not install gsm and toast outside of this directory.

INSTALL_ROOT = $(PWD)/../output/arm-linux

# Where do you want to install the gsm library, header file, and manpages?
#
# Leave GSM_INSTALL_ROOT empty to not install the GSM library outside of
# this directory.

GSM_INSTALL_ROOT = $(INSTALL_ROOT)
GSM_INSTALL_LIB = $(GSM_INSTALL_ROOT)/lib
GSM_INSTALL_INC = $(GSM_INSTALL_ROOT)/inc
GSM_INSTALL_MAN = $(GSM_INSTALL_ROOT)/man/man3


# Where do you want to install the toast binaries and their manpage?
#
# Leave TOAST_INSTALL_ROOT empty to not install the toast binaries outside
# of this directory.

TOAST_INSTALL_ROOT   = $(INSTALL_ROOT)
TOAST_INSTALL_BIN = $(TOAST_INSTALL_ROOT)/bin
TOAST_INSTALL_MAN = $(TOAST_INSTALL_ROOT)/man/man1

#  Other tools

SHELL  = /bin/sh
LN  = ln
BASENAME  = basename
AR  = $(CROSS)ar
ARFLAGS  = cr
RMFLAGS  = -f
FIND  = find
COMPRESS  = compress
COMPRESSFLAGS  =
# RANLIB  = true
RANLIB   = $(CROSS)ranlib

#
#    You shouldn't have to configure below this line if you're porting.
#


# Local Directories

ROOT = .
ADDTST = $(ROOT)/add-test
TST = $(ROOT)/tst
MAN = $(ROOT)/man
BIN = $(ROOT)/bin
SRC = $(ROOT)/src
LIB = $(ROOT)/lib
TLS = $(ROOT)/tls
INC = $(ROOT)/inc

# Flags

# DEBUG = -DNDEBUG
######### Remove -DNDEBUG to enable assertions.

CFLAGS = $(CCFLAGS) $(SASR) $(DEBUG) $(MULHACK) $(FAST) $(LTP_CUT)
 $(WAV49) $(CCINC) -I$(INC)
######### It's $(CC) $(CFLAGS)

LFLAGS = $(LDFLAGS) $(LDINC)
######### It's $(LD) $(LFLAGS)


# Targets

LIBEXT  = so
LIBGSM = $(LIB)/libgsm.$(LIBEXT)

TOAST = $(BIN)/toast
UNTOAST = $(BIN)/untoast
TCAT = $(BIN)/tcat

# Headers

GSM_HEADERS = $(INC)/gsm.h

HEADERS = $(INC)/proto.h  
  $(INC)/unproto.h 
  $(INC)/config.h  
  $(INC)/private.h 
  $(INC)/gsm.h  
  $(INC)/toast.h  
  $(TLS)/taste.h

# Sources

GSM_SOURCES = $(SRC)/add.c  
  $(SRC)/code.c  
  $(SRC)/debug.c  
  $(SRC)/decode.c  
  $(SRC)/long_term.c 
  $(SRC)/lpc.c  
  $(SRC)/preprocess.c 
  $(SRC)/rpe.c  
  $(SRC)/gsm_destroy.c 
  $(SRC)/gsm_decode.c 
  $(SRC)/gsm_encode.c 
  $(SRC)/gsm_explode.c 
  $(SRC)/gsm_implode.c 
  $(SRC)/gsm_create.c 
  $(SRC)/gsm_print.c 
  $(SRC)/gsm_option.c 
  $(SRC)/short_term.c 
  $(SRC)/table.c

TOAST_SOURCES = $(SRC)/toast.c   
  $(SRC)/toast_lin.c 
  $(SRC)/toast_ulaw.c 
  $(SRC)/toast_alaw.c 
  $(SRC)/toast_audio.c

SOURCES = $(GSM_SOURCES)  
  $(TOAST_SOURCES) 
  $(ADDTST)/add_test.c 
  $(TLS)/sour.c  
  $(TLS)/ginger.c  
  $(TLS)/sour1.dta 
  $(TLS)/sour2.dta 
  $(TLS)/bitter.c  
  $(TLS)/bitter.dta 
  $(TLS)/taste.c  
  $(TLS)/sweet.c  
  $(TST)/cod2lin.c 
  $(TST)/cod2txt.c 
  $(TST)/gsm2cod.c 
  $(TST)/lin2cod.c 
  $(TST)/lin2txt.c

# Object files

GSM_OBJECTS = $(SRC)/add.o  
  $(SRC)/code.o  
  $(SRC)/debug.o  
  $(SRC)/decode.o  
  $(SRC)/long_term.o 
  $(SRC)/lpc.o  
  $(SRC)/preprocess.o 
  $(SRC)/rpe.o  
  $(SRC)/gsm_destroy.o 
  $(SRC)/gsm_decode.o 
  $(SRC)/gsm_encode.o 
  $(SRC)/gsm_explode.o 
  $(SRC)/gsm_implode.o 
  $(SRC)/gsm_create.o 
  $(SRC)/gsm_print.o 
  $(SRC)/gsm_option.o 
  $(SRC)/short_term.o 
  $(SRC)/table.o

TOAST_OBJECTS = $(SRC)/toast.o   
  $(SRC)/toast_lin.o 
  $(SRC)/toast_ulaw.o 
  $(SRC)/toast_alaw.o 
  $(SRC)/toast_audio.o

OBJECTS =  $(GSM_OBJECTS) $(TOAST_OBJECTS)

# Manuals

GSM_MANUALS = $(MAN)/gsm.3  
  $(MAN)/gsm_explode.3 
  $(MAN)/gsm_option.3 
  $(MAN)/gsm_print.3

TOAST_MANUALS = $(MAN)/toast.1

MANUALS =  $(GSM_MANUALS) $(TOAST_MANUALS) $(MAN)/bitter.1

# Other stuff in the distribution

STUFF =  ChangeLog   
  INSTALL   
  MACHINES  
  MANIFEST  
  Makefile  
  README   
  $(ADDTST)/add_test.dta 
  $(TLS)/bitter.dta 
  $(TST)/run


# Install targets

GSM_INSTALL_TARGETS = 
  $(GSM_INSTALL_LIB)/libgsm.$(LIBEXT)  
  $(GSM_INSTALL_INC)/gsm.h  
  $(GSM_INSTALL_MAN)/gsm.3  
  $(GSM_INSTALL_MAN)/gsm_explode.3 
  $(GSM_INSTALL_MAN)/gsm_option.3  
  $(GSM_INSTALL_MAN)/gsm_print.3

TOAST_INSTALL_TARGETS = 
  $(TOAST_INSTALL_BIN)/toast  
  $(TOAST_INSTALL_BIN)/tcat  
  $(TOAST_INSTALL_BIN)/untoast  
  $(TOAST_INSTALL_MAN)/toast.1


# Default rules

.c.o:
  $(CC) $(CFLAGS) $?
  @-mv `$(BASENAME) $@` $@ > /dev/null 2>&1

# Target rules

all:  $(LIBGSM) $(TOAST) $(TCAT) $(UNTOAST)
  @-echo $(ROOT): Done.

tst:  $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/test-result
  @-echo tst: Done.

addtst:  $(ADDTST)/add $(ADDTST)/add_test.dta
  $(ADDTST)/add < $(ADDTST)/add_test.dta > /dev/null
  @-echo addtst: Done.

misc:  $(TLS)/sweet $(TLS)/bitter $(TLS)/sour $(TLS)/ginger  
   $(TST)/lin2txt $(TST)/cod2txt $(TST)/gsm2cod
  @-echo misc: Done.


myinstall:
 -mkdir -p $(GSM_INSTALL_ROOT)/bin
 -mkdir -p $(GSM_INSTALL_ROOT)/man/man3
 -mkdir -p $(GSM_INSTALL_ROOT)/man/man1
 -mkdir -p $(GSM_INSTALL_ROOT)/lib
 cp -f lib/$(LIBGSM)  $(GSM_INSTALL_ROOT)/lib

  cp -f inc/*  $(GSM_INSTALL_ROOT)/inc

 

 


install: myinstall #toastinstall gsminstall
  @-echo install: Done.


# The basic API: libgsm

$(LIBGSM): $(LIB) $(GSM_OBJECTS)
ifeq ('so',$(LIBEXT))
#  -rm $(RMFLAGS) $(LIBGSM)
   $(CC) -shard -o $(LIBGSM) $(GSM_OBJECTS)
else
  $(AR) $(ARFLAGS) $(LIBGSM) $(GSM_OBJECTS)
  $(RANLIB) $(LIBGSM)
endif  


# Toast, Untoast and Tcat -- the compress-like frontends to gsm.

$(TOAST): $(BIN) $(TOAST_OBJECTS) $(LIBGSM)
  $(LD) $(LFLAGS) -o $(TOAST) $(TOAST_OBJECTS) $(LIBGSM) $(LDLIB)

$(UNTOAST): $(BIN) $(TOAST)
  -rm $(RMFLAGS) $(UNTOAST)
  $(LN) $(TOAST) $(UNTOAST)

$(TCAT): $(BIN) $(TOAST)
  -rm $(RMFLAGS) $(TCAT)
  $(LN) $(TOAST) $(TCAT)

[1] [2]
关键字:ARM-Linux  移植 引用地址:gsm库(libgsm)在ARM-Linux下的移植

上一篇:Linux 驱动分析--s3c6410 的SDIO驱动分析
下一篇:Linux 蓝牙系列 -- ARM-Linux蓝牙工具的移植

推荐阅读最新更新时间:2026-03-23 12:06

ARM-Linux移植之(三)——init进程启动流程分析
我们通常使用Busybox来构建根文件系统的必要的应用程序。Busybox通过传入的参数来决定执行何种操作。当init进程启动时,实际上调用的是Busybox的init_main()函数,下面我们来分析这个函数,看init进程究竟是怎样一个流程。我分析的Busybox源码是1.7.0版本的,其他版本会略有不同。部分代码省略我们只看关键性代码。 首先看init_main函数 int init_main(int argc, char **argv); int init_main(int argc, char **argv) { …………………………….. …………………………….. //初始化控制台 console_i
[单片机]
ARM-Linux触摸屏驱动移植--问题总结
硬件平台:FL2440 内核版本:2.6.28 主机系统:Ubuntu 11.04 内核版本:2.6.39 1、由于自己编译的内核触摸屏驱动选项选择的问题,触摸屏搞了好久 由于自己编译内核将触摸屏驱动以模块的形式编译的,方便自己调试ADC驱动和触摸屏驱动。遇到以下问题: 编译完触摸屏驱动完成后,利用insmod ts.ko加载驱动,之后在/dev/下生成鼠标结点文件mouse0,没有生成ts0 由于将触摸屏接口也一M的形式编译了,改成* /dev下不生成event*节点,编译选项中选择Event interface 后面的touch screen驱动以模块的形式编译进内核,手动加载,方便自己调试 重
[单片机]
<font color='red'>ARM-Linux</font>触摸屏驱动<font color='red'>移植</font>--问题总结
ARM-Linux驱动移植--DM9000网卡驱动移植
硬件平台:FL2440 内核版本:2.6.39 主机平台:Ubuntu 11.04 内核版本:2.6.35 交叉编译器:arm-linux-gcc 4.3.2 原创作品,转载请标明出处 http://blog.csdn.net/yming0221/article/details/6641579 1、DM9000网卡驱动的分析请见 http://blog.csdn.net/yming0221/article/details/6609742 2、如果想自己调试DM9000网卡驱动,那么在编译内核之前将网卡驱动不要编译进内核,启动后自己编译并加载内核 由于一般的驱动或者程序是通过NFS挂载到开发板上的,所以,如果没有网卡
[单片机]
Konqueror/embedded向ARM-Linux平台的移植和汉化
引言 目前,嵌入式浏览器已经逐渐成为高端手机和PDA的标准配置。 Konqueror/embeded作为嵌入式Linux操作系统的首选浏览器得到了广泛使用。但是由于该浏览器是自由软件,因此向具体嵌入式平台移植时存在一定的难度。本文主要介绍了Konqueror/embedded向ARM-Linux平台上的整个移植和汉化过程,以便工程师参考和使用。    Konqueror/embedded的结构    Konqueror/embedded是由底层网络连接,图形化用户界面和处理HTML绘制的引擎KHTML构成的。底层的通信协议实现是基于KIO/slave机制来实现的;GUI界面采用Kparts组建技术和Qt的基本构件;
[单片机]
Konqueror/embedded向<font color='red'>ARM-Linux</font>平台的<font color='red'>移植</font>和汉化
ARM-Linux S5PV210 UART驱动(2)---- 终端设备驱动
  在Linux中,UART串口驱动完全遵循tty驱动的框架结构,但是进行了底层操作的再次封装,所以先介绍tty终端设备驱动。 一、终端设备   1.串行端口终端(/dev/ttySACn)   2.伪终端(/dev/pty/)   3.控制台终端(/dev/ttyn,/dev/console) 二、驱动结构   1.tty分层结构如下图所示:    包含tty核心、tty线路规程、tty驱动,其中tty规程的工作是以特殊的方式格式化从一个用户或者硬件接收到的数据,常采用一个协议转换的形式,如PPP、Bluetooth。   2.tty主要源文件关系及数据流向如下图: 特定的tty设备驱动的主体工作是填充tty_driv
[单片机]
<font color='red'>ARM-Linux</font> S5PV210 UART驱动(2)---- 终端设备驱动
ARM-Linux S5PV210 UART驱动(4)----串口驱动初始化过程
对于S5PV210 UART驱动来说,主要关心的就是drivers/serial下的samsung.c和s5pv210.c连个文件。 由drivers/serial/Kconfig:   config SERIAL_SAMSUNG     depends on ARM && PLAT_SAMSUNG   config SERIAL_S5PV210     depends on SERIAL_SAMSUNG && (CPU_S5PV210 || CPU_S5P6442) && SERIAL_SAMSUNG_CONSOLE 可以看出模块的依赖关系,先加载samsung.ko,然后再加载s5pv210.ko。 所以串
[单片机]
<font color='red'>ARM-Linux</font> S5PV210 UART驱动(4)----串口驱动初始化过程
arm-Linux 编译动态 简单实例
本文讲述了一个简单的例子 ,很好的解释了“编译动态库”。 一、准备工作 1.使用oracle VM Virtualbox软件安装Ubuntu虚拟机 2.下载好相关的软件并传输到虚拟机下,安装好交叉编译器。 二、编译应用 该例子以 1.c , 2.c, 2.h组成 1. 代码编辑 下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:2.h,一个.c文件:2.c,我们将这个文件编译成一个动态库:libtest2.so。 在Linux下编辑代码,可以使用vi,也可以使用gedit; 使用degit编辑 2.c, 2.h 如下图所示 然后我们用交叉编译器命令 :(用交叉编译是为了让生
[单片机]
<font color='red'>arm-Linux</font> 编译动态<font color='red'>库</font> 简单实例
ARM-Linux开发与MCU开发比较
1.ARM-Linux应用开发和单片机开发的不同 这里先要做一个说明,对于ARM的应用开发主要有两种方式:一种是直接在ARM芯片上进行应用开发,不采用操作系统,也称为裸机编程,这种开发方式主要应用于一些低端的ARM芯片上,其开发过程非常类似单片机,这里不多叙述。还有一种是在ARM芯片上运行操作系统,对于硬件的操作需要编写相应的驱动程序,应用开发则是基于操作系统的,这种方式的嵌入式应用开发与单片机开发差异较大。ARM-Linux应用开发和单片机的开发主要有以下几点不同: 应用开发环境的硬件设备不同 单片机:开发板、仿真器(调试器)、USB线; ARM-Linux:开发板、网线、串口线、SD卡; 对于ARM-Linux
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved