У меня есть небольшой модуль 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(). Есть ли что-то, что я упустил из виду? Что может быть причиной такого поведения?
import_module
в C, вы не должны связывать свою программу C с модулем, а вместо этого должны создавать модуль Cython в виде файла .so. Вызовimport_module
загружает файл .so (предоставляя вам доступ к функциям), поэтому вполне возможно, что вы в конечном итоге столкнетесь с конфликтом, связывая и загружая файл .so. - person DavidW   schedule 08.07.2015gcc -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