我有一个cython文件random.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);

最佳答案

尝试将您的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++)

关于python - 我可以在C++中将动态库编译与Cython一起使用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46467660/

10-10 18:37
查看更多