1. 前提
安装libfreeswitch-dev库或者编码编译freeswitch. 安装方法自行搜索.
附debian安装方法:
sudo apt install libfreesswitch-dev
2. CMakeLists
新建cmake项目, CMakeLists.txt参考如下
# 设置 CMake 的最低版本
cmake_minimum_required(VERSION 3.0)
# 项目名称和语言
project(mod_demo)
# C++版本
set(CMAKE_CXX_STANDARD 11)
# 设置模块的版本号
set(MOD_DEMO_VERSION_MAJOR 1)
set(MOD_DEMO_VERSION_MINOR 0)
# 生成的库文件不加lib前缀
set(CMAKE_SHARED_MODULE_PREFIX "")
# 设置 FreeSWITCH 的源代码路径, 源码编译且安装位置非默认位置才需要设置
set(FREESWITCH_ROOT_DIR "/path/to/freeswitch/install")
# 设置 FreeSWITCH 的头文件路径
set(FREESWITCH_Header_DIR ${FREESWITCH_ROOT_DIR}/include/freeswitch)
# 设置 FreeSWITCH 库文件路径
set(FREESWITCH_LIB_DIR ${FREESWITCH_ROOT_DIR}/lib)
# 设置安装路径
set(MOD_OUTPUT_DIR ${FREESWITCH_LIB_DIR}/freeswitch/mod)
# 设置配置文件安装路径
set(MOD_CONFIG_DIR ${FREESWITCH_ROOT_DIR}/etc/freeswitch/autoload_configs)
# 头文件搜索路径
include_directories(${FREESWITCH_Header_DIR})
# 库文件搜索路径
link_directories(${FREESWITCH_LIB_DIR})
# 添加模块
add_library(${CMAKE_PROJECT_NAME} MODULE mod_demo.cpp)
# 链接模块所需的库
target_link_libraries(${CMAKE_PROJECT_NAME} freeswitch)
# 设置模块的版本号
set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES VERSION ${MOD_DEMO_VERSION_MAJOR}.${MOD_DEMO_VERSION_MINOR})
# 安装模块
install(TARGETS ${CMAKE_PROJECT_NAME} LIBRARY DESTINATION ${MOD_OUTPUT_DIR}
PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_EXECUTE)
# 安装模块的 XML 配置文件
install(FILES conf/autoload_configs/demo.conf.xml DESTINATION ${MOD_CONFIG_DIR})
3. cmake项目结构
结构如下
├─build
├─conf
| └─autoload_configs
| └─demo.conf.xml
├─CMakeLists.txt
└─mod_demo.cpp
4. 入口函数
mod_demo.cpp
extern "C" {
#include "switch.h"
}
//模块接口函数
SWITCH_MODULE_LOAD_FUNCTION(mod_demo_load);
SWITCH_MODULE_RUNTIME_FUNCTION(mod_demo_runtime);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_demo_shutdown);
SWITCH_MODULE_DEFINITION(mod_demo, mod_demo_load, mod_demo_shutdown, mod_demo_runtime);
// 实现模块加载时被调用函数的逻辑
SWITCH_MODULE_LOAD_FUNCTION(mod_demo_load)
{
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
return SWITCH_STATUS_SUCCESS;
}
//模块运行
SWITCH_MODULE_RUNTIME_FUNCTION(mod_demo_runtime)
{
return SWITCH_STATUS_TERM;
}
//模块卸载
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_demo_shutdown)
{
return SWITCH_STATUS_SUCCESS;
}