Ubuntu下构建Android ABIs版PJSIP时提示找不到OpenSSL库
我之前在给Android编译PJSIP的时候也踩过几乎一模一样的坑,给你几个针对性的排查和解决方向,应该能帮你搞定:
1. 别用错配置脚本,路径要精准到对应ABI
首先,别直接用./Configure Android来指定OpenSSL路径,PJSIP专门提供了适配Android的configure-android脚本,而且路径必须指向对应ABI的OpenSSL编译目录,不能只写到OpenSSL根目录。比如你编译armeabi版本的OpenSSL后,配置命令应该是这样的:
./configure-android --with-openssl=/path/to/your/openssl-build/armeabi
要是混用了不同ABI的路径,比如给x86_64的PJSIP用了armeabi的OpenSSL路径,肯定会找不到匹配的库。
2. 验证OpenSSL库的ABI匹配性
你编译了三个ABI的OpenSSL,一定要确保当前构建PJSIP时引用的是同架构的库。可以用file命令快速验证:
file /path/to/openssl-build/armeabi/lib/libcrypto.a
输出里应该明确显示ARM相关标识;x86_64版本的话会显示x86-64,如果架构不匹配,哪怕路径对了也会报错。
3. 确保OpenSSL目录结构符合PJSIP预期
PJSIP的配置脚本默认会在指定的OpenSSL路径下找include和lib子目录,你的编译输出得符合这个结构:
/path/to/openssl-build/armeabi/ ├── include/ │ └── openssl/ │ ├── aes.h │ └── ...(所有OpenSSL头文件) └── lib/ ├── libcrypto.a └── libssl.a
如果你的头文件或库文件在自定义路径下,得手动通过CFLAGS和LDFLAGS指定:
./configure-android --with-openssl=/path/to/openssl-build/armeabi \ CFLAGS="-I/path/to/your/custom-openssl-include" \ LDFLAGS="-L/path/to/your/custom-openssl-lib"
4. 检查NDK环境变量是否正确设置
PJSIP的Android编译依赖NDK的环境变量,确保你已经正确配置了NDK_ROOT,而且NDK版本和PJSIP兼容(别用太新的NDK,部分版本适配可能有延迟):
export NDK_ROOT=/path/to/your/android-ndk-r21e export PATH=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
不同NDK版本的工具链路径可能不一样,比如r23+的工具链路径是$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin,旧版本可能是arm-linux-androideabi-开头的工具链。
5. 强制PJSIP链接静态OpenSSL库
有时候PJSIP会优先查找动态库,但你只有静态库,可以在配置时添加参数强制静态链接:
./configure-android --with-openssl=/path/to/openssl-build/armeabi \ --enable-static --disable-shared
或者直接在LDFLAGS里明确指定静态库:
./configure-android --with-openssl=/path/to/openssl-build/armeabi \ LDFLAGS="-lcrypto -lssl"
6. 看配置日志找具体问题
如果以上方法都没用,去看PJSIP生成的config.log文件,里面会详细记录配置过程中查找OpenSSL的每一步,比如是找不到头文件还是库文件,根据日志里的具体提示调整路径或参数就行。
内容的提问来源于stack exchange,提问作者Ashish Gupta

