Python加载C编译的libdata.so时出现ELFCLASS32错误求助
解决OSError: wrong ELF class: ELFCLASS32问题
这个错误我之前也碰到过,本质就是动态库的架构和运行的Python架构不匹配——你编译出了32位的.so文件,但你的Python是64位的(或者反过来),系统没法加载跨架构的二进制库。下面一步步解决:
第一步:确认架构匹配情况
先搞清楚你的系统和Python到底是32位还是64位:
- 查看系统架构:运行命令
输出uname -mx86_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
相关产品推荐
相关产品推荐

