任务:将asterisk1.8.24.0移植到rt5350上面
交叉工具链:mipsel-linux(3.4.2)
1. 配置asterisk,执行./configure --host=mipsel-linux
找不到termcap和libxml2,分别对他们交叉编译,然后将生成的库拷贝到交叉工具链的lib目录下即可。
再执行./configure --host=mipsel-linux,发现还是找不到libxml2。根据提示可以将其关闭。
执行./configure --host=mipsel-linux --disable-xmldoc
2. 编译asterisk, 执行make,编译报错,报错信息望记了,实际就是少了SDL库,交叉编译后,将库文件和
头文件都拷贝到交叉工具链的include和lib目录下。再编译即可。
3. 成功编译后,并没有生成chan_sip.so(最重要的文件)。
修改menuselect.makeopts文件,将chan_sip去掉。即可编译。
在编译channels/sip/reqresp_parser.c时报错
LC_CTYPE_MASK undeclared
解决办法,修改include/asterisk/autoconfig.h文件,去掉#define HAVE_XLOCALE_H 1这行。
这样就可以生成出chan_sip.so了。
实际这个问题比较奇怪,在configure的时候,可以看到这两句,
checking for locale_t in locale.h... no
checking for locale_t in xlocale.h... no
理论上说,HAVE_XLOCALE_H这个宏不应该被定义。
4. 因为rt5350上面只有一个4MB大小的norflash,所以只能将其放到外部存储上来运行。
所以重新配置asterisk,./configure --host=mipsel-linux --disable-xmldoc --prefix=/media/sda1
make && make install。
注意:先在上午机上面创建/media/sda1这个目录,这样在make install 后,就可以直接在/media/sda1目录
下得到编译好的asterisk了。
5. 将编译好的asterisk拷贝到外部存储上运行,发现不正常,但又看不到错误信息,
修改main/asterisk.c ,将daemon(1, 0)的第二个参数改为1,再编译,然后只把asterisk这个可执行文件拷贝过 去即可。
6. 再次运行后,看到报错信息,在源码里搜索报错信息后,发现是main/asterisk.c的这一行报的错
res = bind(ast_socket, (struct sockaddr *)&sunaddr, sizeof(sunaddr));
实际就在绑定unix域协议socket的时候报的错,再使用unix域协议的时候,实际是绑定了一个本地的socket
类型的文件,经过自己编写测试程序,发现是没法在外部存储上创建这个socket文件。(应该是外部存储是
FAT32文件系统的缘故,估计格式化为ext3就行了。)那么我们可以将其指 定到norflash上即可。
7. 经过查看源码,发现这个socket文件的路径是在configure的时候生成在defaults.h这个头文件里的,修改这个头文件,将#define DEFAULT_SOCKET改为norflash的位置即可。再次编译,将编译出来的asterisk文件拷贝过去即可。