gcc ошибка сегментирования при выполнении кода, сгенерированного с помощью cython
Пытаюсь использовать полученный с помощью cython файл .c по данному примеру
Похожий вопрос задавал здесь, но по другому поводу
OS - 18.04.1-Ubuntu
На cython код самый простой:
# program.pyx
cdef public int test():
print('hello, world')
return 0
Далее на bash:
cython program.pyx
Получил файлы:
- program.h
- program.c
Написал дальше файл .c:
/*--- main.c ---*/
#include "Python.h"
#include "program.h"
int main(int argc, char* argv[]) {
Py_Initialize();
PyInit_program();
test();
Py_Finalize();
return 0;
}
Успешно компилирую все с помощью gcc:
gcc $(python3-config --cflags) program.c main.c $(python3-config --ldflags) -fPIC
Компилируется в файл a.out, добавил права: sudo chmod +x a.out
Однако когда пытаюсь выполнить./a.out получаю:
Ошибка сегментирования (стек памяти сброшен на диск)
ТАКЖЕ ХОЧУ ЗАМЕТИТЬ
Если компилировать все с параметрами python2.7, ./a.out успешно выполняется
Для этого в main.c поменял строку PyInit_program(); на initprogram(); и выполнил:
gcc $(python-config --cflags) program.c main.c $(python-config --ldflags) -fPIC
./a.out
результат: hello, world
Как устранить ошибку для python3?
Ответы (1 шт):
Задал вопрос на исходниках
Там указали, что main.c должен выглядеть так:
/*--- main.c ---*/
#include "Python.h"
#include "program.h"
int main(int argc, char* argv[]) {
PyObject *pmodule;
wchar_t *program;
program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
printf("Fatal error: cannot decode argv[0], got %d arguments\n", argc);
exit(1);
}
if (PyImport_AppendInittab("program", PyInit_program) == -1) {
printf("Error: could not extend in-built modules table\n");
exit(1);
}
Py_SetProgramName(program);
Py_Initialize();
pmodule = PyImport_ImportModule("program");
test();
PyMem_RawFree(program);
Py_Finalize();
return 0;
}
Все заработало