使用ctypes时错误“错误的ELF类”
在我把系统从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出了问题。