You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake编译PJSIP项目遇未定义符号错误,求解决方案

解决PJSIP CMake构建未定义符号问题

正确的CMakeLists.txt配置

直接利用CMake的pkg-config模块自动处理PJSIP的静态链接依赖,避免手动管理库顺序和系统依赖:

cmake_minimum_required(VERSION 3.10)
project(pjsip_demo)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 启用pkg-config支持
find_package(PkgConfig REQUIRED)

# 导入PJSIP的静态库配置(包含所有编译和链接参数)
pkg_check_modules(PJPROJECT REQUIRED IMPORTED_TARGET libpjproject)

# 生成可执行文件
add_executable(pjsip_demo main.cpp)

# 链接PJSIP目标(自动带入所有依赖库和编译选项)
target_link_libraries(pjsip_demo PRIVATE PkgConfig::PJPROJECT)

关键说明

  1. IMPORTED_TARGET的作用:这个参数会让CMake把pkg-config返回的所有编译标志、链接库(包括系统依赖如ssl、crypto、asound等)封装成一个目标,彻底避免手动写链接库时的顺序错误——这是命令行编译正常但CMake失败的核心原因。
  2. 静态链接强制设置:如果上述配置仍有问题,可在pkg_check_modules中添加STATIC参数,明确要求静态链接:
    pkg_check_modules(PJPROJECT REQUIRED IMPORTED_TARGET STATIC libpjproject)
    
  3. pkg-config路径检查:如果PJSIP是自定义路径安装(非/usr/local),需要在运行cmake前设置环境变量,让CMake找到PJSIP的.pc文件:
    export PKG_CONFIG_PATH=/your/pjsip/install_dir/lib/pkgconfig:$PKG_CONFIG_PATH
    

测试代码示例(参考)

#include <pjsua2.hpp>
using namespace pj;

int main() {
    try {
        Endpoint ep;
        ep.libCreate();
        
        EpConfig cfg;
        ep.libInit(cfg);
        ep.libStart();
        
        // 这里可以添加业务逻辑
        
        ep.libDestroy();
    } catch (Error& err) {
        return 1;
    }
    return 0;
}

错误排查补充

如果仍出现未定义符号,检查CMake输出日志,确认PJPROJECT_LIBRARIES包含了所有PJSIP组件库(pjlib、pjlib-util、pjsip、pjsip-ua等)以及对应的系统依赖库。若缺失,可手动指定PJSIP安装路径的pkg-config文件:

set(PKG_CONFIG_PATH "/your/pjsip/install_dir/lib/pkgconfig" CACHE STRING "pkg-config path")

内容的提问来源于stack exchange,提问作者rudolfninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:00:22