Я пытаюсь провести некоторые базовые эксперименты с Cython (с конечной целью создания библиотеки, которую я могу использовать на других языках), следуя этим документам .Однако, пытаясь скомпилировать базовый пример hello world, компилятор не видит мою функцию, определенную на cython.
Соответствующий код:
hello.pyx:
cdef public api char* say_hi():
return "hello from python!"
, который я затем компилирую в c с помощью cython hello.pyx
sayhi.c:
#include <Python.h>
#include "hello.h"
int main() {
Py_Initialize();
char *hi = say_hi();
printf("%s\n", hi);
Py_Finalize();
}
, который затем пытаюсь скомпилировать в исполняемый файл с
gcc `python2-config --cflags --ldflags` -o compiledhi sayhi.c
это как раз то, что я прочитал с этого более раннего ответа SO .
Но компиляция завершается с ошибкой:
Undefined symbols for architecture x86_64:
"_say_hi", referenced from:
_main in sayhi-302608.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Если это имеет значение, я запускаю все это из оболочки pipenv, используя python 3.7, на Mac с текущей версиейxcode установлен ...
Так как я использую Python 3, и на всякий случай это имеет значение, я также попытался
gcc `python3-config --cflags --ldflags` -o compiledhi sayhi.c
просто как предположение, но не игра в кости.
Документы Cython, связанные выше, описывают режим API как альтернативный способ сделать это, что я также попробовал, заменив код c выше:
#include <Python.h>
#include "hello_api.h"
int main() {
Py_Initialize();
import_hello();
char *hi = say_hi();
printf("%s\n", hi);
Py_Finalize();
}
, это компилируется, но когдаЯ запускаю его, это segfaults.
Помогите?Я думаю, что правильно следую документам, хотя на самом деле я не знаю C ...