Saya cuba menulis modul Python dalam bahasa C, tetapi program C saya sendiri bergantung pada pustaka pihak ketiga (libwiringPi.so) Apabila saya mengimport perpustakaan yang saya hasilkan dalam program sumber Python, saya akan digesa supaya fungsi tersebut belum Definisi, semua fungsi ini ada dalam pustaka pihak ketiga itu. Bagaimanakah cara saya menyusunnya supaya modul yang saya susun boleh dipautkan secara dinamik ke pustaka itu?
Saya juga cuba menggunakan gcc untuk menyusun perpustakaan pautan dinamik secara manual, dan kemudian menggunakan cyes, tetapi ralat yang sama telah dilaporkan; pakej kod.
Kod program C saya
/* Example of embedding Python in another program */ #include "python2.7/Python.h" #include void initdht11(void); /* Forward */ int main(int argc, char **argv) { /* Initialize the Python interpreter. Required. */ Py_Initialize(); /* Add a static module */ initdht11(); /* Exit, cleaning up the interpreter */ Py_Exit(0); return 0; } /* A static module */ /* 'self' is not used */ static PyObject * dht11_foo(PyObject *self, PyObject* args) { wiringPiSetup(); return PyInt_FromLong(42L); } static PyMethodDef dht11_methods[] = { {"foo", dht11_foo, METH_NOARGS, "Return the meaning of everything."}, {NULL, NULL} /* sentinel */ }; void initdht11(void) { PyImport_AddModule("dht11"); Py_InitModule("dht11", dht11_methods); }
setup.py
from distutils.core import setup, Extension dht11module = Extension('dht11', library_dirs = ['/usr/lib'], include_dirs = ['/usr/include'], sources = ['math.c']) setup (name = 'dht11', version = '1.0', description = 'This is a demo package', author = 'Martin v. Loewis', author_email = 'martin@v.loewis.de', url = 'https://docs.python.org/extending/building', long_description = ''' This is really just a demo package. ''', ext_modules = [dht11module])
Mesej ralat
Traceback (most recent call last): File "test.py", line 1, in import dht11 ImportError: /usr/local/lib/python2.7/dist-packages/dht11.so: undefined symbol: wiringPiSetup
Hei, saya bangun pagi dan tiba-tiba terfikir, jadi saya cepat mencubanya.
Masalah ini berlaku kerana anda perlu menambah
-lwiringPi
选项来引用这个库,但是我仔细看了以下执行python setup.py build
之后执行的编译命令,根本就没有加这个选项,解决方式很简单,只需要修改一下setup.py,在Extension里面加上libraries = ['wiringPi']
parameter ini semasa menyusun setup.py yang diubah suai menjadi seperti berikut