如何解决在Py ++中生成Boost接口时的关键错误
我正在使用Py ++和CastXML解析C ++头文件,并使用以下python脚本生成boost.python接口:
# Configurations for compiler and generator
generator_path = "/usr/bin/castxml"
generator_name = "castxml"
compiler = "gnu"
compiler_path = "/usr/bin/gcc"
# Create configuration for CastXML
xml_generator_config = parser.xml_generator_configuration_t(
xml_generator_path=generator_path,xml_generator=generator_name,compiler=compiler,compiler_path=compiler_path,include_paths = [misc include files]
)
# List of all the C++ header of our library
header_collection = [
"/path/to/header/header.h"]
# Parses the source files and creates a module_builder object
builder = module_builder.module_builder_t(
header_collection,xml_generator_path=generator_path,xml_generator_config=xml_generator_config)
# Automatically detect properties and associated getters/setters
builder.classes().add_properties(exclude_accessors=True)
# Define a name for the module
builder.build_code_creator(module_name="pymodule")
# Writes the C++ interface file
builder.write_module('pymodule_pylib.cpp')
我运行此脚本并输入标题,但始终出现此错误:
KeyError: '(('/usr/include/c++/7/tuple',343),('::','std','_Inherited'))'
我将其追溯到pygccxml中的以下函数,在该函数中它似乎正在尝试构建声明层次结构,并且在下面指出的数组中找不到上述键:
def _join_class_hierarchy(self,namespaces):
classes = [
decl for decl in pygccxml.declarations.make_flatten(namespaces)
if isinstance(decl,pygccxml.declarations.class_t)]
leaved_classes = {}
# selecting classes to leave
for class_ in classes:
key = self._create_key(class_)
if key not in leaved_classes:
leaved_classes[key] = class_
# replacing base and derived classes with those that should be leave
# also this loop will add missing derived classes to the base
for class_ in classes:
leaved_class = leaved_classes[self._create_key(class_)]
for base_info in class_.bases:
leaved_base = leaved_classes[
self._create_key(base_info.related_class)]
# treating base class hierarchy of leaved_class
leaved_base_info = pygccxml.declarations.hierarchy_info_t(
related_class=leaved_base,access=base_info.access)
if leaved_base_info not in leaved_class.bases:
leaved_class.bases.append(leaved_base_info)
else:
index = leaved_class.bases.index(leaved_base_info)
leaved_class.bases[
index].related_class = leaved_base_info.related_class
# treating derived class hierarchy of leaved_base
leaved_derived_for_base_info = \
pygccxml.declarations.hierarchy_info_t(
related_class=leaved_class,access=base_info.access)
if leaved_derived_for_base_info not in leaved_base.derived:
leaved_base.derived.append(leaved_derived_for_base_info)
else:
index = leaved_base.derived.index(
leaved_derived_for_base_info)
leaved_base.derived[index].related_class = \
leaved_derived_for_base_info.related_class
for derived_info in class_.derived:
#---------Line where code fails----------
leaved_derived = leaved_classes[
self._create_key(
derived_info.related_class)]
# treating derived class hierarchy of leaved_class
leaved_derived_info = pygccxml.declarations.hierarchy_info_t(
related_class=leaved_derived,access=derived_info.access)
if leaved_derived_info not in leaved_class.derived:
leaved_class.derived.append(leaved_derived_info)
# treating base class hierarchy of leaved_derived
leaved_base_for_derived_info = \
pygccxml.declarations.hierarchy_info_t(
related_class=leaved_class,access=derived_info.access)
if leaved_base_for_derived_info not in leaved_derived.bases:
leaved_derived.bases.append(leaved_base_for_derived_info)
# this loops remove instance we from parent.declarations
for class_ in classes:
key = self._create_key(class_)
if id(leaved_classes[key]) == id(class_):
continue
else:
if class_.parent:
declarations = class_.parent.declarations
else:
# yes,we are talking about global class that doesn't
# belong to any namespace. Usually is compiler generated
# top level classes
declarations = namespaces
declarations_ids = [id(decl) for decl in declarations]
del declarations[declarations_ids.index(id(class_))]
return leaved_classes
我无法克服此错误,并且不确定是什么原因引起的。我确实打印出了用于搜索leaved_derived
数组的其他键及其有趣之处,因为其中有一个:(('/usr/include/c++/7/tuple',185),'_Inherited'))
,它非常相似(第一个元组中的行号是185,而不是343),但是会产生没错任何关于这里可能发生的事情的解释将不胜感激
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。