使用ctypes时错误“错误的ELF类”

3 投票
2 回答
13793 浏览
提问于 2025-04-16 18:19

在我把系统从32位的Ubuntu换成64位之后,我的python+ctypes+c99代码就坏掉了。我了解到,错误信息./libfoo.so: wrong ELF class: ELFCLASS32的意思是,我的libfoo.so[1]是一个32位的库,而Python需要的是64位的版本。我该怎么告诉gcc/ctypes生成一个32位的库呢?

谢谢大家的反馈!

错误信息:

 File "foo.py", line 8, in <module>
    autofoo=cdll.LoadLibrary("./libfoo.so")
  File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./libfoo.so: wrong ELF class: ELFCLASS32

[1] 我用gcc -c -std=c99 -lm -D_GNU_SOURCE -Wall -pedantic -fopenmp -ofoo.o foo.c来编译libfoo.so

2 个回答

0

给gcc加上 -m64 这个参数,意思是让它尽量生成64位的代码。

3

你需要把目标文件编译成64位的,并且要是位置无关的,然后再把这个目标文件和共享库链接起来,使用64位的选项。可以这样做:

gcc -c -fPIC -m64 -std=c99 -lm -D_GNU_SOURCE -Wall -pedantic -fopenmp -o foo.o foo.c
gcc -m64 -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o

这样做应该能让你在我用过的任何GNU工具链上得到一个64位的库。如果你还是遇到错误,可能是你的工具链或者Python出了问题。

撰写回答