编译带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实现,导致符号重复。按以下步骤解决:
清理旧编译产物
进入PJProject根目录,执行:make clean rm -rf third_party/build/srtp rm third_party/lib/libsrtp-*.a重新配置PJSIP,明确启用OpenSSL
使用configure-android脚本时,添加OpenSSL相关参数,替换/path/to/your/openssl为你实际的OpenSSL编译目录:./configure-android --enable-openssl --with-openssl=/path/to/your/openssl强制SRTP只使用OpenSSL实现(若配置后仍报错)
进入third_party/build/srtp目录,修改Makefile:- 确保编译列表中移除
aes_icm.c,只保留aes_icm_ossl.c - 或者在编译CFLAGS中添加
-DUSE_OPENSSL,让SRTP自动切换到OpenSSL实现
- 确保编译列表中移除
重新编译
make dep && make make java
注意:确保OpenSSL是用对应Android NDK工具链编译的,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Змей Горыныч
相关产品推荐
相关产品推荐

