我可以在c ++中使用cython的动态库编译吗?

时间:2017-09-28 11:08:49

标签: python c++ dll cython

我有cythonrandom.pyx这样的文件:

cdef public int get_random_number():
    return 4

setup.py就像这样:

from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension

extensions = [Extension("librandom", ["random.pyx"])]
setup(
    ext_modules = cythonize(extensions)
)

然后我得到一个动态库librandom.so,现在我想在c ++而不是python中使用这个so文件。

#include <stdio.h>
#include "random.h"

int main() {
    printf("%d\n",get_random_number());
    return 0;
}

现在,当我编译g++ -o main main.cpp -lrandom -L. -Wl,-rpath,"\$ORIGIN"时,我得到这样的错误:

In file included from main.cpp:2:0:
random.h:26:1: error: ‘PyMODINIT_FUNC’ does not name a type
 PyMODINIT_FUNC initrandom(void);

1 个答案:

答案 0 :(得分:1)

尝试将您的c代码更改为:

#include <stdio.h>
#include "Python.h"
#include "random.h"

int main() {
    Py_Initialize(); 
    PyInit_random(); // see "random.h"
    int r = get_random_number();
    Py_Finalize();
    printf("%d\n", r);
    return 0;
}

请注意,要运行可执行文件,您无法摆脱python环境。

另见How to import Cython-generated module from python to C/C++ main file? (programming in C/C++)