gcc看不到我的cython hello world函数

时间:2019-05-19 23:15:08

标签: python c gcc cython

these docs之后,我正在尝试使用cython进行一些基本实验(最终目标是创建一个可以用其他语言使用的库)。尝试编译一个基本的hello world示例,但是,编译器看不到我的cython定义的函数。

相关代码:

hello.pyx:

cdef public api char* say_hi():
    return "hello from python!"

然后我用cython hello.pyx编译为c

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

这就是我从this earlier SO answer滑过的内容。

但是编译失败并出现以下错误:

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)

如果有问题,我将在安装了当前版本xcode的Mac上使用python 3.7在pipenv shell中运行所有这些程序...

由于我使用的是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();
}

这可以编译,但是当我运行它时,它会出现段错误。

有帮助吗?我认为我正确地遵循了文档,尽管我实际上并不了解C ...

0 个答案:

没有答案