cari

Rumah  >  Soal Jawab  >  teks badan

Apabila memuatkan modul Python yang ditulis dalam bahasa C, ia menggesa bahawa fungsi dalam .so tidak dijumpai?

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 <wiringPi.h>

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 <module>
    import dht11
ImportError: /usr/local/lib/python2.7/dist-packages/dht11.so: undefined symbol: wiringPiSetup
怪我咯怪我咯2742 hari yang lalu606

membalas semua(1)saya akan balas

  • ringa_lee

    ringa_lee2017-05-18 11:02:29

    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

    from distutils.core import setup, Extension
    
    dht11module = Extension('dht11',
                        library_dirs = ['/usr/lib'], #指定库的目录
                        include_dirs = ['/usr/include'], #制定头文件的目录
                        libraries = ['wiringPi'], #指定库的名称
                        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])

    balas
    0
  • Batalbalas