Я пытаюсь создать простой пример «Hello world», который встраивает функцию Python / Cython в приложение, написанное на C. Я хочу также встроить интерпретатор Python, чтобы приложение не имело внешнихзависимость.Это часть более крупного проекта по использованию кода Python в приложении C / C ++, но я хотел сначала создать простой пример, чтобы изучить основы.Конечное приложение называется demo
, и оно просто вызывает функцию с именем helloworld
, которая написана на Cython.Функция helloworld
просто выводит "Hello world!"(очевидно ...).
Моя проблема в том, что я получаю ошибку сегментации при запуске исполняемого файла demo
.
Мой пример основан в основном на этом руководстве.Мне пришлось немного изменить пример, так как он не компилировался (то есть команда cython выдавала ошибку) с первого раза.Вот полный код и набор команд, которые я выполнил:
helloworld.pyx
cdef public void helloworld():
print("Hello world!")
demo.c
#include <Python.h>
#include "helloworld.h"
int main () {
Py_Initialize ();
PyInit_helloworld ();
// Call the Cython function
helloworld ();
Py_Finalize ();
return 0;
}
Команды, используемые для компиляции:
$ cython -3 helloworld.pyx
$ gcc -g -fpic -c helloworld.c -o helloworld.o `python3.6-config --includes`
$ gcc -g -fpic -c demo.c -o demo.o `python3.6-config --includes`
$ gcc -g -o demo helloworld.o demo.o `python3.6-config --libs` -L /home/rob/anaconda3/lib
Однако при запуске demo
я получаю следующее:
$ ./demo
Segmentation fault (core dumped)
Копаем немного глубже:
$ gdb demo
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
[output truncated]
(gdb) r
Starting program: /home/rob/cython_test/demo
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x00005555555569cb in __Pyx_PyObject_Call (func=0x0, arg=0x0, kw=0x0) at helloworld.c:1493
warning: Source file is more recent than executable.
1493 ternaryfunc call = func->ob_type->tp_call;
В случае, если это уместно, здесьвывод команд python3.6-config
, встроенных в флаги gcc
:
$ python3.6-config --includes
-I/home/rob/anaconda3/include/python3.6m -I/home/rob/anaconda3/include/python3.6m
$ python3.6-config --libs
-lpython3.6m -lpthread -ldl -lutil -lrt -lm
Я также попытался скомпилировать вышесказанное с помощью "системной" установки Python, поскольку я немного подозревал, чтоРаспространение Anaconda вызывало мои проблемы, но результат был полностью таким же.