gcc не видит мою функцию приветствия на cython world - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь провести некоторые базовые эксперименты с 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 ...

...