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

Python加载C编译的libdata.so时出现ELFCLASS32错误求助

解决OSError: wrong ELF class: ELFCLASS32问题

这个错误我之前也碰到过,本质就是动态库的架构和运行的Python架构不匹配——你编译出了32位的.so文件,但你的Python是64位的(或者反过来),系统没法加载跨架构的二进制库。下面一步步解决:

第一步:确认架构匹配情况

先搞清楚你的系统和Python到底是32位还是64位:

  • 查看系统架构:运行命令
    uname -m
    
    输出x86_64表示64位系统,i686/i386表示32位系统。
  • 查看Python架构:运行命令
    python -c "import platform; print(platform.architecture())"
    
    输出('64bit', 'ELF')就是64位Python,('32bit', 'ELF')则是32位。

第二步:重新编译对应架构的动态库

根据Python的架构,强制gcc编译匹配的动态库:

如果Python是64位

编译时加上-m64参数生成64位库:

# 重新编译目标文件
gcc -c -Wall -Werror -fpic -m64 data.c
# 生成64位动态库
gcc -shared -o libdata.so data.o -m64

如果Python是32位

编译时加上-m32参数(注意:64位系统上编译32位库需要先安装32位依赖,比如RHEL/CentOS要装glibc-devel.i686、libgcc.i686这类包):

gcc -c -Wall -Werror -fpic -m32 data.c
gcc -shared -o libdata.so data.o -m32

额外优化:修复Python代码的遍历问题

你原来的Python代码里,f().contents只会获取指针指向的单个int值,没法遍历整个数组。改成通过索引访问更合理:

import ctypes

# 加载动态库并绑定函数
lib = ctypes.CDLL('./libdata.so')
my_func = lib.my_func
# 指定函数返回值为int类型的指针
my_func.restype = ctypes.POINTER(ctypes.c_int)

# 获取数组指针,遍历前3个元素(对应C代码里的aa数组长度)
arr_ptr = my_func()
print [arr_ptr[i] for i in range(3)]  # 输出结果会是[10, 20, 30]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:49:43