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

编译带OpenSSL的Android版PJSIP时出现Duplicate symbol错误

问题

我正在尝试使用支持OpenSSL的PJSIP库构建用于SIP连接的Android应用。先完成了带OpenSSL的PJSIP编译,接着尝试生成SWIG Java绑定,执行make命令时,在aes_icm.c和aes_icm_ossl.c文件中出现三个重复符号错误。不使用OpenSSL时,所有编译流程均正常。

编译环境:

  • MacOS
  • PJSIP版本2.14.1
  • NDK版本22.1.7171670
  • OpenSSL版本3.3.1

错误信息:

ld: error: duplicate symbol: srtp_aes_icm_128
>>> defined at aes_icm.c
>>>            aes_icm.o:(srtp_aes_icm_128) in archive /pjproject/third_party/lib/libsrtp-aarch64-unknown-linux-android.a
>>> defined at aes_icm_ossl.c
>>>            aes_icm_ossl.o:(.data.rel.ro.srtp_aes_icm_128+0x0) in archive /pjproject/third_party/lib/libsrtp-aarch64-unknown-linux-android.a

ld: error: duplicate symbol: srtp_aes_icm_256
>>> defined at aes_icm.c
>>>            aes_icm.o:(srtp_aes_icm_256) in archive /pjproject/third_party/lib/libsrtp-aarch64-unknown-linux-android.a
>>> defined at aes_icm_ossl.c
>>>            aes_icm_ossl.o:(.data.rel.ro.srtp_aes_icm_256+0x0) in archive /pjproject/third_party/lib/libsrtp-aarch64-unknown-linux-android.a

ld: error: duplicate symbol: srtp_mod_aes_icm
>>> defined at aes_icm.c
>>>            aes_icm.o:(srtp_mod_aes_icm) in archive /pjproject/third_party/lib/libsrtp-aarch64-unknown-linux-android.a
>>> defined at aes_icm_ossl.c
>>>            aes_icm_ossl.o:(.data.srtp_mod_aes_icm+0x0) in archive /pjproject/third_party/lib/libsrtp-aarch64-unknown-linux-android.a
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [android/pjsua2/src/main/jniLibs/arm64-v8a/libpjsua2.so] Error 1
make: *** [java] Error 2
解决方案

这个问题是因为编译SRTP时同时包含了默认AES实现和OpenSSL实现,导致符号重复。按以下步骤解决:

  1. 清理旧编译产物
    进入PJProject根目录,执行:

    make clean
    rm -rf third_party/build/srtp
    rm third_party/lib/libsrtp-*.a
    
  2. 重新配置PJSIP,明确启用OpenSSL
    使用configure-android脚本时,添加OpenSSL相关参数,替换/path/to/your/openssl为你实际的OpenSSL编译目录:

    ./configure-android --enable-openssl --with-openssl=/path/to/your/openssl
    
  3. 强制SRTP只使用OpenSSL实现(若配置后仍报错)
    进入third_party/build/srtp目录,修改Makefile:

    • 确保编译列表中移除aes_icm.c,只保留aes_icm_ossl.c
    • 或者在编译CFLAGS中添加-DUSE_OPENSSL,让SRTP自动切换到OpenSSL实现
  4. 重新编译

    make dep && make
    make java
    

注意:确保OpenSSL是用对应Android NDK工具链编译的,避免兼容性问题。

内容的提问来源于stack exchange,提问作者Змей Горыныч

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:00:09