在你的 Doxyfile 中,设置
GENERATE_XML = YES
然后您可以在 XML 文件中找到您的调用图。对于标有调用者图的每个函数,您会<referencedby>
在输出中找到可以使用的元素。这是我的一个 C 文件的示例:
<memberdef kind="function" id="spfs_8c_1a3"
prot="public" static="yes" const="no" explicit="no"
inline="no" virt="non-virtual">
<type>svn_error_t *</type>
<definition>svn_error_t * init_apr</definition>
<argsstring>(apr_pool_t **ppool, int *argc, char const *const **argv)</argsstring>
<name>init_apr</name>
<!-- param and description elements clipped for brevity ... -->
<location file="src/spfs.c" line="26" bodystart="101" bodyend="120"/>
<referencedby refid="spfs_8c_1a13" compoundref="spfs_8c"
startline="45" endline="94">main</referencedby>
</memberdef>
因此,对于每个 memberdef/referencedby 对,您都有一个调用者-被调用者关系,您可以通过 XSLT 获取它:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="//memberdef[@kind eq 'function']"/>
</xsl:template>
<xsl:template match="memberdef">
<xsl:variable name="function-name"
select="concat(definition, argsstring)"/>
<xsl:for-each select="referencedby">
<xsl:value-of select="concat(./text(), ' calls ', $function-name, '
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
它为每个调用者-被调用者提供了一条线,如下所示:
main calls svn_error_t * init_apr(apr_pool_t **ppool, int *argc, char const *const **argv)
您需要调整该 XSLT,然后以跨越最少边的方式对该有向图进行分区。呜呼,一个NP完全问题!幸运的是,有很多关于这个主题的论文,其中一些在这里: http: //www.sandia.gov/~bahendr/partitioning.html