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

Posted

技术标签:

【中文标题】我可以在 C++ 中使用 cython 编译的动态库吗?【英文标题】:Can I use dynamic library compile with cython in c++? 【发布时间】:2017-09-28 11:08:48 【问题描述】:

我有一个 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++中使用这个so文件而不是python。

#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);

【问题讨论】:

您需要将 python-includes 以及 python 库添加到您的构建中,而且如果不先初始化,您将无法使用 cython 模块的功能。该答案填补了 cython 教程的空白,可能对您有所帮助:***.com/a/45424720/5769463 【参考方案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++)

【讨论】:

以上是关于我可以在 C++ 中使用 cython 编译的动态库吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何手动编译使用 C++ 的 Cython 代码?

如何在 Cython 中使用不同的 C++ 编译器?

使用/编译 C++ 与 Cython

Cython 中 C++ 函数的性能不佳

如何用 Cython 包装 C++ 类?

Windows 10 上的 anaconda cythonize C++