直接上 Python 源码
import sys
import os
import shutil
import random
import re
def GetDeps():
rand_int = random.randint(1, 1 << 30)
tmpdir = './tmp' + "{}".format(rand_int)
os.makedirs(tmpdir)
directory = '.'
if len(sys.argv) > 1:
directory = sys.argv[1]
extensions = ('.a', '.o', '.obj')
for filename in os.listdir(directory):
filepath = os.path.join(directory, filename)
sys.stderr.write(filepath + '\n')
if os.path.isfile(filepath) and filename.endswith(extensions):
os.system('nm "' + filepath + '" > ' + tmpdir + '/' + filename + '.txt')
inlist = []
outlist = []
filelist = []
for filename in os.listdir(tmpdir):
filepath = os.path.join(tmpdir, filename)
if os.path.isfile(filepath):
with open(filepath, 'r') as file:
fileinlist = set()
fileoutlist = set()
for line in file:
str = line.strip()
linelist = str.split(' ')
if len(linelist) >= 2:
if linelist[-2] == 'U':
fileinlist.add(linelist[-1])
elif linelist[-2] == 'T' or linelist[-2] == 't':
fileoutlist.add(linelist[-1])
fileinlist.difference_update(fileoutlist)
fileinlist.discard('printf')
inlist.append(fileinlist)
outlist.append(fileoutlist)
filenameWithOutExtension = '.'.join(filename.split('.')[:-1])
filenameWithOutLib = re.sub(r'^lib', '', filenameWithOutExtension)
filelist.append(filenameWithOutLib)
shutil.rmtree(tmpdir)
n = len(inlist)
print('## 依赖关系图\n')
print('``` mermaid')
print('graph LR')
for i in range(n):
set1 = inlist[i]
for j in range(n):
set2 = outlist[j]
interSet = set1.intersection(set2)
if len(interSet) > 0:
print(' ' + filelist[i] + ' --> ' + filelist[j])
print('```\n')
print('## 单个库所依赖关系图\n')
for i in range(n):
print('### ' + filelist[i] + ' 的依赖关系图\n')
setIn1 = inlist[i]
setOut1 = outlist[i]
print('``` mermaid')
print('graph LR')
for j in range(n):
setIn2 = inlist[j]
setOut2 = outlist[j]
interSet12 = setIn1.intersection(setOut2)
if len(interSet12) > 0:
print(' ' + filelist[i] + ' --> ' + filelist[j])
interSet21 = setIn2.intersection(setOut1)
if len(interSet21) > 0:
print(' ' + filelist[j] + ' --> ' + filelist[i])
print('```\n')
print('## 原始依赖关系数据\n')
print('``` text')
for i in range(n):
set1 = inlist[i]
for j in range(n):
set2 = outlist[j]
interSet = set2.intersection(set1)
if len(interSet) > 0:
print(filelist[i] + ' ---> ' + filelist[j] + ':')
print(interSet)
print('')
print('```')
if __name__ == "__main__":
GetDeps()
用 OpenModelica 中的库查看输出


【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战