arm for asterisk1.8

来源:互联网 发布:免费棋牌源码 编辑:程序博客网 时间:2024/06/05 00:42

./configure --host=arm-linux后报错,找不到termcap,于是下载了termcap-1.3.1进行交叉编译。

再次./configure --host=arm-linux后依然报错,找不到libxml2,于是下载了libxml2-2.7.2进行交叉编译。

再次./configure --host=arm-linux后成功通过。


然后,make报错,unknow value ' ' found in build_tools/menuselect-deps for NATIVE_ARCH

打算交叉编译一下ncurses试试。

交叉编译ncurses后,依然报错。

因为是menuselect报的错,那么就将menuselect交叉编译,menuselect在交叉编译时,报错,找不到libmxml.a,

然后发现menuselect下有mxml目录,那么就再把mxml交叉编译,编译虽然报错,但可以生成libmxml.a,再去

编译menuselect,这时报 找不倒gtk-xll-2.0,网上查了查,交叉编译gtk比较复杂,打算换个思路,看看能不能不用

menuselect



2014年3月5日,昨天,asterisk1.8非常神奇的用arm的天嵌210的交叉工具链编译过去了,现在把他放到一个AM3352的板子上去跑,运行asterisk的脚本执行直接报错退出了,发现是lsb的问题,asterisk是一个后台守护进程的方式运行的,而且是按照lsb的规范的,我的板子上没有这个东西。不过没关系,不用管他,直接运行asterisk的主程序也可以。运行asterisk主程序后,什么输出都没有,用ps aux | grep 'asterisk'也没有发现其在后天运行,一定是崩溃退出了。将asterisk主程序的代码都屏蔽掉后(main/asterisk.c),只打印一个输出,还是不行。查看asterisk的make输出,看到这一句。

gcc  -o asterisk -Wl,--export-dynamic -Wl,--version-script,asterisk.exports -Wl,--dynamic-list,asterisk.dynamics     abstract_jb.o acl.o adsi.o alaw.o aoc.o app.o ast_expr2.o ast_expr2f.o asterisk.o astfd.o astmm.o astobj2.o audiohook.o autochan.o autoservice.o bridging.o callerid.o ccss.o cdr.o cel.o channel.o chanvars.o cli.o config.o data.o datastore.o db.o devicestate.o dial.o dns.o dnsmgr.o dsp.o enum.o event.o features.o file.o fixedjitterbuf.o frame.o framehook.o fskmodem.o global_datastores.o hashtab.o heap.o http.o image.o indications.o io.o jitterbuf.o loader.o lock.o logger.o manager.o md5.o netsock.o netsock2.o pbx.o plc.o poll.o privacy.o rtp_engine.o say.o sched.o security_events.o sha1.o slinfactory.o srv.o ssl.o stdtime/localtime.o strcompat.o strings.o stun.o syslog.o taskprocessor.o tcptls.o tdd.o term.o test.o threadstorage.o timing.o translate.o udptl.o ulaw.o utils.o version.o xml.o xmldoc.o editline/libedit.a db1-ast/libdb1.a  buildinfo.o -lssl -lcrypto -lc  -lxml2  -ldl -lpthread -ltermcap  -lm -lresolv 


最后面这几句:-lssl -lcrypto -lc  -lxml2  -ldl -lpthread -ltermcap  -lm -lresolv

是asterisk需要依赖的库,其中只有termcap和xml2是我交叉编译后放入交叉工具链的lib路径下的,其他的都是交叉工具链自带的库。我估计是哪个库出的问题,挨个屏蔽,最后发现是xml2这个库的问题,根据asterisk的手册,他需要依赖libxml2-dev这个库,但是我已经移植了这个库。无耐之下,想了一个办法,我的开发板的rootfs用的是buildroot,用make menuconfig查看了buildroot,里面有libxml2,选中这一项,然后保存退出编译。因为buildroot会自动的下载选中的库并编译。编译完后,将里面的libxml2的动态库和静态库,弄出来,就可以用的。经测试发现asterisk没法用静态的libxml2,编译不过去,可以用动态的。


现在asterisk能跑起来了,但是还是自动退出了。在asterisk.c文件里,添加一个打印信息,发现到这一行就没有打印信息了。

if (daemon(1, 0) < 0)

daemon是linux守护进程的函数,第个参数如果为0的话,就把所有输出都输出到/dev/null里,所以这句后就没有输出了,将其改为1,现在asterisk输出如下

Waring: program compiled against libxml 209 using older 208

Unable to open AMI configuration manager.conf, or configuration is invalid..

Can't find indications config file indications.conf

Could not load features.conf

Could not find valid ccss.conf file. Using cc_max_requests default

183 modules will be loaded.

先看第一行,这是因为编译的时候我用的2.9.1版本的libxml2的头文件,而链接的时候,我用的是2.8.0版本的libxml2库文件,所以不匹配造成的。将上位机的/usr/include/libxml2/libxml里的头文件全部换成2.8.0的,再编译即可。

下面那些打印信息不用管,是正常的输出,但是到模块加载这里就没了,应该是asterisk崩溃了,查找代码后发现就是在加载模块的时候崩溃的。

asterisk的所有模块都是使用so文件提供的,而且是以dlopen的方式加载的,程序就是dlopen的时候崩溃的。

经测试发现是交叉工具链的事,因为我用的是天嵌的210交叉工具链,但是目标版是安之谋的335x,他们的交叉工具链版本是不一致的。因为我自己写了dlopen的测试程序,用天嵌的编译也崩溃,但是335x编译就没事了。

那么我只能用安之谋的工具链来编译了。

但是在编译的时候报错。以下是报错信息。

The 'CRYPTO' dependency was previously satisfied but is now unsatisfied.

The functionality of the following modules will be affected:

chan_iax2

func_aes

实际是在真正开始编译前就报错,从字面意思来看就是configure的时候有crypto,但在编译的时候交叉工具链实际没有这个库。所以报的错。经对比两个makeopts文件,就可以看到。

用./configure --host=天嵌交叉工具链前缀       ./configure --host=安之谋交叉工具链前缀

分别生成makeopts文件,就可以看出其中的差别。

可以将天嵌交叉工具链生成的makeopts替换安之谋生成的makeopts。

今天编译的时候,还是保错,是找不到SDL的头文件,发现是安之谋的交叉工具链里没有SDL的支持。

http://www.libsdl.org/release/

可以从这里下载sdl的源码来交叉编译。也可以用buildroot来下载并自动编译。buildroot自动下载的是

SDL-1.2.15.tar.gz

我是用buildroot来自动下载和编译的SDL,那么只需要将头文件和编译好的库文件都考入到交叉工具链相应的位置上即可。

现在终于编译过去了,将其拷贝到开发板上去运行,asterisk终于跑起来了。

用asterisk -r也可以连接上asterisk后台运行的daemon进程了。

但是用module show命令发现最关键的chan_sip.so模块没有加载,搜索后发现这个模块就没有被编译出来,经过对比上位机的文件后发现,这个文件menuselect.makeopts是不一致的。

这个文件的作用是指示不需要的模块,为什么这么说呢。

---------------------------------------------------------------------------------------------------------------------------------------------

这个地方是asterisk编译的精髓所在。

通过查看asterisk模块子目录的Makefile文件,可以发现每个Makefile里都包含了menuselect.makeopts,menuselect.makedeps,Makefile.moddir_rules文件。并且Makefile.moddir_rules里包含了Makefile.rules。

而且里面有这么一句all: _all。

但是查找整个Makefile文件,都找不到目标all的依赖_all,那么他一定是在某一个被包含的文件之中(上面4个文件之一)。

查找上面4个文件后,在Makefile.moddir_rules这个文件里发现了这一句。

_all: $(LOADABLE_MODS:%=%.so)

再查找LOADABLE_MODS,LOADABLE_MODS:=$(C_MODS) $(CC_MODS)

C_MODS:=$(filter-out $(MENUSELECT_$(MENUSELECT_CATEGORY)),$(ALL_C_MODS))
CC_MODS:=$(filter-out $(MENUSELECT_$(MENUSELECT_CATEGORY)),$(ALL_CC_MODS))

看到这几句,文件基本一目了然了,C_MODS和CC_MODS我们要编译的模块。

我猜测ALL_C_MODS和ALL_CC_MODS应该是asterisk的所有模块,然后通过makefile的filter-out函数将$(MENUSELECT_$(MENUSELECT_CATEGORY)这些模块过滤掉。那么$(MENUSELECT_$(MENUSELECT_CATEGORY)是在哪里定义的呢,我猜测应该是menuselect.makeopts果然,通过对比x86上的这个文件,发现我的menuselect.makeopts这个文件里MENUSELECT_CHANNELS这个模块里,确实是有chan_sip这个模块,证实我之前的猜测。

然后再说Makefile.rules这个文件。

asterisk真正启编译作用的文件是Makefile.rules这个文件,这个文件实际就是asterisk的通用编译规则文件。

这样上面4个文件总结如下:

1.Makefile.rules                          asterisk模块makefile文件的通用编译规则。

2.Makefile.moddir_rules              asterisk模块makefile文件的编译目标文件。

3.menuselect.makeopts              asterisk模块makefile文件不编译的模块指示。

4.menuselect.makedeps             ?????????

---------------------------------------------------------------------------------------------------------------------------------------------

接着上面的问题说,将menuselect.makeopts里面chan_sip和chan_alsa去掉后,再编译,就可以编译这两个模块了。

但是编译报错。是需要依赖库造成了,所以应该是在configure阶段,configure发现我没有这些库,所以生成的menuselect.makeopts里将chan_sip给去掉了,因为asterisk实际支持多种协议,所以sip不是必须的 ,但是对我来说

sip是最重要的。

昨天编译的时候报错,是少alsa,今天再编译居然编译过去了,很奇怪,将编译出的chan_sip和chan_alsa这两个库拷贝到开发版上。重启asterisk,sip模块加载上了。用xlite测试了一下,注册,拨号,音视频都没问题了。

                                                                                                                                                                  3月13号


0 0