我可以在 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 编译的动态库吗?的主要内容,如果未能解决你的问题,请参考以下文章