我目前正在为OpenCV 3.0创建一个模块,并尝试使其在Python中运行。我想我发现OpenCV如何创建Python绑定似乎有问题,但我不知道解决问题的最佳方法是什么。
我的问题如下:
我的模块文件夹中有2个类(modules/xvideo/include/opencv2/xvideo
中的标题),它们是:parentClass.hpp
和childClass.hpp
。当然ChildClass
继承自ParentClass
(名称仅用于示例)。但是脚本gen2.py
(位于modules/python/src2
)正试图在ChildClass
之前创建ParentClass
并最终出现错误:
Generator error: unable to resolve base xvideo_ParentClass for xvideo_ChildClass
这似乎是因为类是按照脚本srcfiles
函数中变量gen
给出的顺序生成的:
def gen(self, srcfiles, output_path):
self.clear()
self.parser = hdr_parser.CppHeaderParser()
# step 1: scan the headers and build more descriptive maps of classes, consts, functions
#print(srcfiles) ##matthieu
for hdr in srcfiles:
decls = self.parser.parse(hdr)
if len(decls) == 0:
#print(hdr + '0') ##matthieu
continue
#else: ##matthieu
#print(hdr) ##matthieu
self.code_include.write( '#include "{0}"\n'.format(hdr[hdr.rindex('opencv2/'):]) )
for decl in decls:
name = decl[0]
if name.startswith("struct") or name.startswith("class"):
# class/struct
p = name.find(" ")
stype = name[:p]
name = name[p+1:].strip()
self.add_class(stype, name, decl)
...
所以我上游找到了如何创建这个列表。看来,该列表是每个模块的子列表的串联,其中每个子列表由CMake文件cmake/OpenCVModule.cmake
在第626行创建:
file(GLOB lib_hdrs
"${CMAKE_CURRENT_LIST_DIR}/include/opencv2/*.hpp"
"${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/*.hpp"
"${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/*.h"
)
但有人可能知道file(GLOB)
有一个indeterministic behaviour。这就是为什么我的子类在该列表中的父类之前,并最终引发错误。
所以我要问的是,如果有人知道绕过这个问题的最佳方法吗? 有没有办法自己指定清单?或者我只是忘了写点什么?请赐教^^