我有一個二進制文件,它可以加載.so
共享對象來擴展功能。這些擴展以C++編碼,但我想使用一些預編碼的python函數,所以我利用了Python C API。到現在爲止還挺好。使用Python C API時導入錯誤
呼叫到Python功能很好的工作,但如果在Python中,我輸入spidev模塊我得到以下錯誤:
import spidev
ImportError: /usr/local/lib/python2.7/dist-packages/spidev.so: undefined symbol: _Py_ZeroStruct
Segmentation fault
如果我進口標準的模塊(SYS,OS,argparse ...)這裏沒有問題。
可能是什麼問題?我知道我可以直接從C++使用spidev,但我想盡可能重用現有的Python代碼。
UPDATE:
作爲@BrianCain和@qarma指出的那樣,它可以是具有依賴於libpython
相關的問題,所以我包括ldd
輸出:
$ ldd myextension.so
/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6f89000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6f5f000)
libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6f54000)
libutil.so.1 => /lib/arm-linux-gnueabihf/libutil.so.1 (0xb6f49000)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6ed8000)
libpython2.7.so.1.0 => /usr/lib/libpython2.7.so.1.0 (0xb6c47000)
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6c1f000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6af0000)
/lib/ld-linux-armhf.so.3 (0xb6fa2000)
libz.so.1 => /lib/arm-linux-gnueabihf/libz.so.1 (0xb6ad2000)
$ ldd /usr/local/lib/python2.7/dist-packages/spidev.so
/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6ed3000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6ea9000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6d7a000)
/lib/ld-linux-armhf.so.3 (0xb6eed000)
UPDATE2:
spidev安裝的輸出。
$ sudo pip install spidev
Downloading/unpacking spidev
Downloading spidev-2.0.tar.gz
Running setup.py egg_info for package spidev
Installing collected packages: spidev
Running setup.py install for spidev
building 'spidev' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/src/linux/include -I/usr/include/python2.7 -c spidev_module.c -o build/temp.linux-armv6l-2.7/spidev_module.o
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-armv6l-2.7/spidev_module.o -o build/lib.linux-armv6l-2.7/spidev.so
Successfully installed spidev
Cleaning up...
$ ldd /usr/local/lib/python2.7/dist-packages/spidev.so
/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6f97000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6f6d000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e3e000)
/lib/ld-linux-armhf.so.3 (0xb6fb1000)
還沒取決於libpython
...
有可能是'spidev.so'構建的'libpython'不是當前正在執行的Python VM使用的'libpython'。 –
請包括你的'pip install'或'python setup.py install'的日誌。適用於Linux x86-64本機Python-2.7.6,distutils-2.7.6,gcc-4.8.2 –
添加了'pip install'日誌。謝謝! –