сборка расширения C для python - «неопределенная ссылка на _Py_GC_generation0» - PullRequest
0 голосов
/ 14 октября 2019

Справочная информация заключается в том, что я хочу реализовать свой собственный объект HashMap с помощью pyhton для расширения C.

Но когда я закончил 'hashmap.c' и использовал distutils 'для компиляциикак модуль, я обнаружил, что что-то не так с 'неопределенной ссылкой на _Py_GC_generation0'.

'_ Py_GC_generation0' указан в 'objimpl.h', код которого показан ниже:

typedef union _gc_head {
    struct {
        union _gc_head *gc_next;
        union _gc_head *gc_prev;
        Py_ssize_t gc_refs;
    } gc;
    double dummy;  /* force worst-case alignment */
} PyGC_Head;

extern PyGC_Head *_PyGC_generation0;

'_PyGC_generation0 'на самом деле определен в' gcmodule.c ', код показан ниже:

static struct gc_generation generations[NUM_GENERATIONS] = {
    /* PyGC_Head,                               threshold,      count */
    {{{GEN_HEAD(0), GEN_HEAD(0), 0}},           700,            0},
    {{{GEN_HEAD(1), GEN_HEAD(1), 0}},           10,             0},
    {{{GEN_HEAD(2), GEN_HEAD(2), 0}},           10,             0},
};

PyGC_Head *_PyGC_generation0 = GEN_HEAD(0);

Я пытался собрать с помощью' python3.lib 'и' python36.lib ', но это не сработало. все еще сообщил об ошибке «неопределенная ссылка на _Py_GC_generation0»

Вот мой код для сборки модуля (путь правильный):

from distutils.core import setup, Extension

hashmap = Extension('hashmap',
                    libraries=['python3', 'python36'],
                    library_dirs = ['E:\\python3.6.6'],
                    sources = ['hashmap.c']
                    )
setup(
    name = 'C extension module',
    version = '1.0',
    description = 'hashmap',
    ext_modules = [hashmap])

Спасибо всем!

1 Ответ

0 голосов
/ 16 октября 2019

как сказал @DavidW, я не должен указывать библиотеки Python. Я получил ответ на Python Doc. Я должен только изменить '_Py_GC_Track ()' на 'Py_GC_Track ()', причина как в картинке: введите описание изображения здесь

...