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

调用OpenSSL的C扩展库(Python ctypes)时出现sk_free未定义错误

解决OpenSSL库编译后ctypes加载提示undefined symbol: sk_free的问题

问题分析

sk_free是OpenSSL栈操作的核心函数,属于libcrypto库范畴。出现未定义符号错误,通常是编译链接环节的路径配置错误、库版本/位数不匹配,或者运行时库加载路径缺失导致的。

解决方案

1. 修正编译命令中的库路径参数

原命令里的-Ideps/vendor/openssl/lib.LINUX是错误用法:-I用于指定头文件(include)目录,库文件路径需要用-L参数。修改后的编译命令如下:

gcc -shared -o mylib.so -fPIC libs/mylib.c -Ilibs/deps -Ideps/vendor/openssl/include -Ldeps/vendor/openssl/lib.LINUX -lcrypto -lssl

2. 检查库与系统的位数兼容性

  • 查看当前系统位数:
    file /bin/bash
    
    输出会明确标注系统是32-bit还是64-bit。
  • 检查厂商提供的OpenSSL库位数:
    file deps/vendor/openssl/lib.LINUX/libcrypto.so
    
    如果两者位数不匹配,必须更换对应位数的OpenSSL库,否则会出现符号无法解析的问题。

3. 验证OpenSSL版本兼容性

sk_free在OpenSSL 1.1.0及以后版本中被废弃,替换为OPENSSL_sk_free。如果遗留代码基于旧版OpenSSL(如1.0.x)开发,但链接了新版库,就会出现符号缺失:

  • 检查libcrypto中的符号:
    nm -D deps/vendor/openssl/lib.LINUX/libcrypto.so | grep sk_free
    
    • 如果输出中只有OPENSSL_sk_free,说明版本不兼容,需要改用对应旧版的OpenSSL库,或者修改代码适配新版API。

4. 确保运行时能加载到厂商的OpenSSL库

编译后的mylib.so可能找不到厂商提供的OpenSSL库,有两种解决方式:

  • 临时设置环境变量:
    export LD_LIBRARY_PATH=deps/vendor/openssl/lib.LINUX:$LD_LIBRARY_PATH
    python your_script.py
    
  • 编译时嵌入库路径(永久生效):
    gcc -shared -o mylib.so -fPIC libs/mylib.c -Ilibs/deps -Ideps/vendor/openssl/include -Ldeps/vendor/openssl/lib.LINUX -Wl,-rpath=deps/vendor/openssl/lib.LINUX -lcrypto -lssl
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:42:26