在Ubuntu(虚拟机)上多次使用源码方式安装freeSwitch软件,由于freeSwitch在编译中依赖很多软件和工具,再加上系统版本和软件源的原因,每一次安装都遇到很多问题,花费大量时间排查,因此,本文记录一下安装过程和一些问题的解决方法。

注:文中使用操作系统版本Ubuntu 22.04.1(虚拟机),其它版本操作系统安装流程和问题解决方法类似。

一、环境安装

1.安装常用包

sudo apt install autoconf libtool-bin g++ pkg-config libtiff-dev
2. 安装libtiff-dev
sudo apt install libtiff-dev

3. 安装spandsp
# git clone https:///freeswitch/spandsp.git
# cd spandsp
# ./bootstrap.sh -j
# ./configure
# make
# sudo make install
# ldconfig

4. 安装sofia-sip
no usable sofia-sip; please install sofia-sip-ua devel package or equivalent
# git clone https:///freeswitch/sofia-sip.git
#cd sofia-sip
# ./bootstrap.sh -j
# ./configure
# make
# make install0
# ldconfig

5. 安装sqlite3
解决方法: sudo apt install libsqlite3-dev
          sudo apt install sqlite3

6. 安装libcurl
sudo apt install libcurl4-nss-dev

7. 安装pcre
sudo apt install libpcre3-dev

8. 安装speexdsp
sudo apt install libspeexdsp-dev

9. 安装libldns
sudo apt install libldns-dev 

10. install libks or disable mod_verto in modules.conf
禁用mod_verto

11. install libks or disable mod_signalwire
禁用mod_signalwire

12. 安装libedit-dev
sudo apt install libedit-dev

13. 安装yasm
sudo apt install yasm

14. 安装uuid和uuid-dev
sudo apt install uuid
sudo apt install uuid-dev

默认安装后,uuid.h 在/usr/include/linux/目录下,而freeswitch源码引用目录是uuid, 因此需要建立/usr/include/uuid目录

$mkdir /usr/include/uuid
$cp /usr/include/linux/uuid.h /usr/include/uuid/

15. apt install libopus-dev

16. sudo apt install libsndfile-dev

二、下载编译

2.1 下载源码
方式一:  github下载
freeSwitch源码下载地址:https:///signalwire/freeswitch
git clone https:///signalwire/freeswitch

注:使用git下载可能会出现异常中断,可以在网页上使用zip包下载的方式

方式二: 文件服务网站下载
也可以通过下面的网站下载源码
 http://files.freeswitch.org/releases/freeswitch/  
方式三:  其它下载方式(如gitee等)

2.2 编译
步骤1: sudo ./bootstrap.sh

步骤2:sudo ./configure

步骤3:sudo make
   

 编译错误处理:
   1. -Werror=implicit-function-declaration错误
       示例:src/switch_apr.c:1134:9: error: implicit declaration of function ‘uuid_unparse_lower’ [-Werror=implicit-function-declaration]
        解决方法: 修改Makefile中CFLAGS一行,忽略错误
           CFLAGS = -g -O2 -Wno-error=implicit-function-declaration 

  2. -Werror=deprecated-declarations错误
  解决方法: 修改Makefile中CFLAGS一行,忽略错误
  CFLAGS = -g -O2 -Wno-error=implicit-function-declaration -Wno-error=deprecated-declarations

  3. -Werror=pedantic错误
  解决方法: 修改Makefile中CFLAGS一行,忽略错误
  CFLAGS = -g -O2 -Wno-error=implicit-function-declaration -Wno-error=deprecated-declarations
  
  4. 禁用一些模块
     比如mode_lua、mod_opus、mod_pgsql、mod_skinny等
     
2.3 安装:
    $ sudo make install

默认安装目录:/usr/local/freeswitch
voip@voip-virtual-machine:/usr/local/freeswitch$ tree -L 1
.
├── bin
├── conf
├── db
├── fonts
├── grammar
├── htdocs
├── images
├── include
├── lib
├── log
├── mod
├── recordings
├── run
└── scripts

2.4 启动freeswitch
进入到安装目录,启动程序。也可以在其它目录使用绝对路径启动
voip@voip-virtual-machine:/usr/local/freeswitch$ ./bin/freeswitch

2.5 终端注册
使用sip终端注册已有账号1000(默认密码1234,默认端口5060)成功。如果一切正常,那么恭喜你,你已经完成基本的安装了。

三、安装问题的解决思路

一般是软件或库找不到,有三种解决方法
1. 使用apt install安装
2. 从github或gitee上下载源码进行编译安装

注:freeswitch可以通过编辑module.conf文件禁用相关模块

四、安装过程中遇到的问题及解决方法

  • 1. build-requirements: autoconf not found.

解决方法: sudo apt install autoconf

  • 2. build-requirements: libtool not found.

解决方法: sudo apt install libtool-bin

  • 3. 缺少spandsp

# git clone https:///freeswitch/spandsp.git
# cd spandsp
# ./bootstrap.sh -j
# ./configure
# make
# make install
# ldconfig

  • 4.缺少sofia-sip

no usable sofia-sip; please install sofia-sip-ua devel package or equivalent
# git clone https:///freeswitch/sofia-sip.git
#cd sofia-sip
# ./bootstrap.sh -j
# ./configure
# make
# make install
# ldconfig

  • 5. fatal error: openssl/ssl.h: No such file or directory

解决方法: sudo apt install libssl-dev

  • 6. Package sqlite3 was not found

解决方法: sudo apt install libsqlite3-dev
                 sudo apt install sqlite3

  • 7. libcurl was not found

       解决方法: sudo apt install libcurl4-nss-dev

  • 8. Package libpcre was not found 

         解决方法: sudo apt install libpcre3-dev

  • 9. Package speex was not found 

             sudo apt install libspeexdsp-dev

  • 10. You need to either install libldns-dev or disable mod_enum in modules.conf

          解决方法: sudo apt install libldns-dev 

  • 11. You need to either install libks or disable mod_verto in modules.conf

            方法一:下载安装 https:///signalwire/libks.git

            方法二:禁用mod_verto
                  sudo vim modules.conf 
                  #endpoints/mod_verto

  • 12. error: You need to either install libedit-dev

                解决方法: sudo apt install libedit-dev

  • 13. 缺少yasm

                 解决方法: sudo apt install yasm

  • 14. You need to either install signalwire-client-c

                方法一:下载编译安装: https:///signalwire/signalwire-c.git

                方法二: 注释掉modules.conf中的signalwire模块

  • 15. 编译错误

                ./include/apr_general.h:33:14: error: ‘__DARWIN_NSIG’ undeclared here (not in a function)
                33 | #define NSIG __DARWIN_NSIG
注: 没找到原因,发现没有代码使用该定,直接将该行定义注释掉

  • 16. 接口过期编译错误

错误1:

In file included from src/switch_apr.c:79:
/usr/include/openssl/md5.h:49:27: note: declared here
   49 | OSSL_DEPRECATEDIN_3_0 int MD5_Init(MD5_CTX *c);
      |                           ^~~~~~~~
src/switch_apr.c:1177:9: warning: ‘MD5_Update’ is deprecated: Since OpenSSL 3.0 [-Wdeprecated-declarations]
 1177 |         MD5_Update(&md5_context, input, inputLen);

解决方法:关闭接口过期警告

               sudo vim Makefile
              CFLAGS = -g -O2 -Wno-error=deprecated-declarations

错误2:

skinny_protocol.c:685:65: error: array subscript ‘skinny_message_t {aka struct skinny_message}[0]’ is partly outside array bounds of ‘unsigned char[292]’ [-Werror=array-bounds]
CFLAGS = -g -O2 -Wno-error=deprecated-declarations -Wno-error=array-bounds

解决方法:关闭相应告警

               sudo vim Makefile
              CFLAGS = -g -O2  -Wno-error=array-bounds

  • 17. 没有libavformat-dev and libswscale-dev

Makefile:1481: *** You must install libavformat-dev and libswscale-dev to build mod_av.  Stop.

解决方法:
sudo apt install libavformat-dev
sudo apt install libswscale-dev

注: 如果编译时还提示找不到,需要重新执行sudo ./configure

  • 18 缺少libtiff

configure: error: "Cannot build without libtiff (does your system require a libtiff-devel package?)"

解决方法:sudo apt install libtiff-dev

  • 19 缺少uuid

src/switch_apr.c:81:10: fatal error: uuid/uuid.h: No such file or directory

解决方法:

 sudo apt install uuid

 如果依旧找不到,查看 一下uuid.h文件的位置, 在笔者环境中,如下

$ ls /usr/include/linux/uuid.h 
/usr/include/linux/uuid.h

可以看出uuid.h在linux目录下,只要相应的创建/usr/lnclude/uuid目录,并将linux/uuid.h拷贝过去可以了

  • 20 找不到uuid_xx函数

/usr/bin/ld: ./.libs/libfreeswitch.so: undefined reference to `uuid_parse'
/usr/bin/ld: ./.libs/libfreeswitch.so: undefined reference to `uuid_unparse_lower'
/usr/bin/ld: ./.libs/libfreeswitch.so: undefined reference to `uuid_generate'

解决方法:sudo apt install uuid-dev