在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 ...