Справка Cython: пропуск несовместимой библиотеки

У меня есть небольшой модуль cython, который называется deLorean.pyx.

cdef public struct Vehicle:
    int speed
    float power

cdef public api void activate(int v):
        print "Time travel achieved at " + str(v) + " mph."

У меня также есть файл setup.py, который выглядит так:

from distutils.core import setup
from Cython.Build import cythonize

setup(name = 'First try', ext_modules = cythonize(["deLorean.pyx"]),)

Когда я собираюсь скомпилировать код cython, используя это: cython deLorean.pyx

Затем будут созданы файлы *.h, *.c и *_api.h.

У меня также есть программа на языке marty.c, которая выглядит так:

#include "Python.h"
#include "deLorean_api.h"

#include <stdlib.h>

struct Vehicle car;

int main(int argc, char** agrv){
    printf("HELLO");
    Py_Initialize();
    import_deLorean();
    car.speed = 33;
    car.power = 12.3;
    printf("speed: %d, power: %f", car.speed, car.power);
    activate(12);
    Py_Finalize();
    return 0;
}

Затем я компилирую весь модуль, используя это:

gcc -fPIC -L/usr/lib -I/usr/local/include/python2.7 -lpython2.7 deLorean.c marty.c -o deLorean -g

Это компилируется с этими примечаниями:

/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc

/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc

Это создает файл a.out; однако при запуске возникают ошибки.

Когда я запускаю его в gdb, это вывод:

(gdb) r
Starting program: /root/Asta/Cython-0.22.1/deLorean
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb)

Я поиграл с marty.c и сузил виновника до момента, когда вызывается функцияactivate(). Есть ли что-то, что я упустил из виду? Что может быть причиной такого поведения?


person Asta Saidak    schedule 07.07.2015    source источник
comment
Это просто частный случай stackoverflow.com/questions/16927885/? Я подозреваю, что ошибка seg может быть не связана, но я не знаю...   -  person DavidW    schedule 08.07.2015
comment
Что еще более важно, у меня сложилось впечатление, что когда вы используете механизм import_module в C, вы не должны связывать свою программу C с модулем, а вместо этого должны создавать модуль Cython в виде файла .so. Вызов import_module загружает файл .so (предоставляя вам доступ к функциям), поэтому вполне возможно, что вы в конечном итоге столкнетесь с конфликтом, связывая и загружая файл .so.   -  person DavidW    schedule 08.07.2015
comment
@DavidW Когда я создаю библиотеку .so, я использую следующие команды: gcc -lpython2.7 -L/usr/lib -I/usr/local/include/python2.7 -m32 -shared -o libdeLorean.so -fPIC deLorean.c В файле, включенном из /usr/local/include/python2.7/Python.h:58, из deLorean.c:4: /usr/ local/include/python2.7/pyport.h:886:2: error: #error LONG_BIT defi отображается неправильно для платформы (плохая конфигурация gcc/glibc?). Но я все равно получаю ошибки   -  person Asta Saidak    schedule 08.07.2015
comment
Боюсь, попытка отладки сборки расширения cython, вероятно, будет выше моих сил (я подозреваю, что все, что я могу сказать, это то, что это работает для меня). Вы смотрели на подход, основанный на setuptools, указанный в документации Cython? Это, по крайней мере, гарантирует, что он получает правильные аргументы для gcc.   -  person DavidW    schedule 09.07.2015
comment
Итак, для тех, кто интересуется, как я решил свою проблему, вот как. Я просто убедился, что у меня где-то установлена ​​64-битная версия Python, а затем, как только я узнал, где я просто добавлю эти места в компиляцию. Мне также пришлось изменить LD_LIBRARY_PATH на то же место. Удачи!   -  person Asta Saidak    schedule 09.07.2015