Reputation: 31908
I want to wrap a library with the following header file:
#include "rbtree.h"
struct interval_tree_node {
struct rb_node rb;
unsigned long start; /* Start of interval */
unsigned long last; /* Last location _in_ interval */
unsigned long __subtree_last;
};
extern void
interval_tree_insert(struct interval_tree_node *node, struct rb_root *root);
extern void
interval_tree_remove(struct interval_tree_node *node, struct rb_root *root);
extern struct interval_tree_node *
interval_tree_iter_first(struct rb_root *root,
unsigned long start, unsigned long last);
extern struct interval_tree_node *
interval_tree_iter_next(struct interval_tree_node *node,
unsigned long start, unsigned long last);
This is my intervaltree.pxd:
cdef extern from "src/intervaltree.h":
struct interval_tree_node:
struct rb_node
void interval_tree_insert(struct interval_tree_node *node, struct rb_root *root)
void interval_tree_remove(struct interval_tree_node *node, struct rb_root *root)
struct interval_tree_node * interval_tree_iter_first(struct rb_root *root, unsigned long start, unsigned long last)
struct interval_tree_node * interval_tree_iter_next(struct interval_tree_node *node, unsigned long start, unsigned long last)
And here is my setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
setup(
ext_modules = cythonize([Extension("intervaltree", ["intervaltree.pyx"])])
)
My intervaltree.pyx
is just empty, or
cimport intervaltree
When I run python setup.py install
I get the following error:
Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from "src/intervaltree.h":
struct interval_tree_node:
struct rb_node
void interval_tree_insert(struct interval_tree_node *node, struct rb_root *root)
^
------------------------------------------------------------
intervaltree.pxd:6:56: Expected ')', found '*'
Since the examples in the docs Defining external declarations use the syntax
int queue_push_head(Queue* queue, QueueValue data)
not
int queue_push_head(Queue *queue, QueueValue data)
I tried to change that part, but it did not seem to help. What am I doing wrong?
Upvotes: 1
Views: 1334
Reputation: 30891
You're missing a cdef
in front of struct interval_tree_node
so Cython isn't recognising it as a type:
cdef struct interval_tree_node
rb_node rb # assuming you've also defined rb_node somewhere
Similarly, you want to write interval_tree_node
, not struct interval_tree_node
in your Cython code.
Update from OP. This is how it was supposed to look in the end:
cdef extern from "src/rbtree.h":
cdef struct rb_root:
pass
cdef extern from "src/interval_tree.h":
cdef struct interval_tree_node:
pass
void interval_tree_insert(interval_tree_node *node, rb_root *root)
void interval_tree_remove(interval_tree_node *node, rb_root *root)
interval_tree_node * interval_tree_iter_first(rb_root *root, unsigned long start, unsigned long last)
interval_tree_node * interval_tree_iter_next(interval_tree_node *node, unsigned long start, unsigned long last)
Upvotes: 1