<p>我不知道它为什么会为公共函数生成混乱的名称-它的运行与<a href="http://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html#using-cython-declarations-from-c" rel="nofollow noreferrer">the documentation</a>相反。但它也在为我做这件事。我怀疑这是一个bug,但建议您暂时只使用损坏的名称。在</p>
<p>您可能需要将<code>setCatNum</code>的返回类型设置为<code>void</code>。目前它返回一个<code>PyObject*</code>(总是<code>None</code>),这是没有用的,意味着您必须处理它的引用计数。在</p>
<pre><code>cdef public void setCatNum(Cat* )
</code></pre>
<p>我想你会被Python2和3的区别弄糊涂了。文档建议将<code>init<modulename></code>替换为</p>
^{pr2}$
<p>这是您需要做的唯一更改-实际上不需要使用模块对象。在</p>
<p>一个有效的例子:</p>
<pre><code>#include <Python.h>
#include "cat.h"
#include <iostream>
int main() {
auto err = PyImport_AppendInittab("cat", PyInit_cat);
if (err) {
std::cout << "ERROR!\n";
return 1;
}
Py_Initialize();
auto cat_module = PyImport_ImportModule("cat"); // you don't actually have to do anything with this module object
Cat c;
__pyx_f_3cat_setCatNum(&c);
std::cout << __pyx_f_3cat_getCatNum(&c) << "\n";
Py_Finalize();
}
</code></pre>
<p>使用在Linux上成功编译</p>
<pre><code>g++ example_cpp.cpp -o example `python3-config includes libs` ./cat.cpython-36m-x86_64-linux-gnu.so
</code></pre>
<p>(您可能需要更改<code>cat</code>文件名)</p>