编译freeswitch踩的那点坑
由于虚拟机里面装了ubunutu 18,本来想直接装freeswitch的deb报,进行方案快速验证和freeswitch学习。结果,按照官方的步骤去执行,发现源有问题。
接着就进入了苦逼的编译过程,说实话,对freeswitch的官方文档表示迷惑,不是很习惯文档中描述的内容跳来跳去的样子。后来找来找去,就零零散散的参考按照了以下几个文档进行下去,基本采取默认配置,并没有作为其他配置修改:
https://freeswitch.org/confluence/display/FREESWITCH/Installation
https://freeswitch.org/confluence/display/FREESWITCH/Ubuntu#Ubuntu-InstallfromRepo
https://freeswitch.org/confluence/display/FREESWITCH/Linux+Quick+Install+Guide#LinuxQuickInstallGuide-GenerateInstallationandConfigurationFiles
首先先说一下步骤:
安装依赖
apt-get install git-core subversion build-essential autoconf automake libtool libncurses5 libncurses5-dev make libjpeg-dev liblua5.3-dev
apt-get install libcurl4-openssl-dev libexpat1-dev libopus-dev libgnutls-dev libtiff4-dev libx11-dev unixodbc-dev libssl-dev python2.6-dev zlib1g-dev libzrtpcpp-dev libasound2-dev libogg-dev libvorbis-dev libperl-dev libgdbm-dev libdb-dev python-dev uuid-dev libpq-dev libsndfile-dev
sudo apt-get install gawk
update-alternatives --set awk /usr/bin/gawk
下载freeswitch代码
FSfile=$(curl -s https://files.freeswitch.org/releases/freeswitch/ | grep -oE “freeswitch-[0-9].[0-9].[0-9]*.-release.tar.bz2″ | tail -n 1) && echo Downloading $FSfile && curl https://files.freeswitch.org/freeswitch-releases/$FSfile | tar -xj && mv ${FSfile/.tar.bz2//} freeswitch
编译x264
这是为了启动mod_av模块的时候,而进行的准备工作,以下命令行为:
./configure --enable-static --prefix=/usr --enable-pic
make ; make install
编译ffmpeg
如果不编译ffmpeg,或不安装libavformat-dev就进行执行./configure,又刚好开启了freeswitch的mod_av,那就会出现You must install libavformat-dev to build mod_av. Stop错误。
在网上查一同,会发现需要编译libav,事实上却被大坑了一把。这主要还是由于ffmpeg与libav的关系有关。
libav是从ffmpeg拉出的一个分支,网上对libav说法很多,又说libav是从早期版本拉出来,也有说后来libav已经和ffmpeg的master保持同步等等。
但真实去编译的时候,发现了一个巨坑,也就是freeswitch报错AVFormatContext中不存在url成员。到ffmpeg和libav官网上一查。发现最新版本的libav确实没有这个变量,而ffmpeg 4.x的文档里有。果断改成编译ffmpeg。
另外还要喷一下libav的官方文档,各种详细说明藏的非常深。。。
下好ffmpeg 4.x的源代码后,开始编译
./configure --enable-shared --enable-gpl --enable-libx264 --enable-pic
make && make install
编译libk
git clone https://github.com/signalwire/libks.git
cd libk
cmake .
make ; make install
编译signalwire-c
git clone https://github.com/signalwire/signalwire-c.git
cd signalwire-c
cmake .
make ; make install
mod_lua编译不过
尽管安装了lua的开发库,但还是会出现找不到lua头文件的情况,找到
/src/mod/languages/mod_lua/Makefile
并找到如下行
DEFAULT_INCLUDES = -I. -I$(top_builddir)/src/include -I$(top_builddir)/libs/esl/src/include -I$(top_builddir)/libs/xmlrpc-c
修改成
DEFAULT_INCLUDES = -I. -I$(top_builddir)/src/include -I$(top_builddir)/libs/esl/src/include -I$(top_builddir)/libs/xmlrpc-c -I/usr/include/lua5.3
并到/usr/lib/x86_64-linux-gnu下
对liblua.so做个软连,即
ln -sf liblua5.3.so liblua.so
出现implicit declaration of function ‘ks_json_get_object_cstr’; did you mean ‘ks_json_get_object
由于版本不一致引起的,freeswitch、signalwire-c和libks版本不要一致,需要换版本。由于我用的freeswitch是1.10版,所以直接用9月份附近的这两个库就没问题了。
切换libks与signalwire-c版本后cmake不过的问题
直接从github上下载release的1.3.0版本,出现了cmake不过的情况:
— cotire 1.7.10 loaded.
Platform is linux
Build type: Debug CXX Flags:
Install prefix: /usr
LibKS Version 1.3
CMake Error at CMakeLists.txt:291 (string):
string sub-command REPLACE requires at least four arguments.
Found UUID setup target at imported location: /usr/lib/x86_64-linux-gnu/libuuid.so
看了一下cmake的配置文件,报错的位置主要是为了生成一个changlog文本,直接注释掉这行即可
#string(REPLACE "\"" "" CHANGELOG ${CHANGELOG})
阿斯顿
注意点
由于configure在执行的时候,会检查大部分依赖是否存在,但仅对关键依赖进行报错,且输出的检查内容太多以至于没有那么多耐心去看。
因此在出现configure不报错,make期间有某个mod编译失败的话,那就必须要用排错后,再次执行configure在进行make,反正就是各种复杂和扯淡。
编译完成后的运行
由于freeswitch会加载相应的mod,还有配置文件,所以需要执行一下make isntall;假设在configure阶段没有指定具体的prefix,就会默认安装到/urs/local/下。如果不需要这样,可以明确指定perfix位置。
运行freeswitch,执行 ./freeswitch即可