閱讀558 返回首頁    go 阿裏雲 go 技術社區[雲棲]


ruby和MinGW的一次融合

我們在使用C編程時會遇到一個問題,比如頭文件的一個函數包含在一個lib中,但是

在實際連接中我們不知道它在哪個庫中。也許可行的一種辦法是直接上網查詢某個

函數的依賴條件,這對於常用函數是沒問題的!但是對於複雜而又缺少文檔的第三方

lib來說,無異於大海撈針。

 

自此通過2種辦法來嚐試解決這個問題,我們先看第一種:

 

在Windows下使用批處理語言來查找指定的函數符號:

 

crt.bat:

@echo off

set gccpath=d:/downloadsvr/mingwstudio/mingw

dir %gccpath%/lib /b>files.txt

if not exist files md files

for /f %%i in (files.txt) DO (
    set fprefix=%%i
    %gccpath%/bin/nm.exe -s -D %gccpath%/lib/%%i>files/%%i.txt
    for %%a in (files/%%i.txt) do (
        if %%~za equ 0 del %%a
    )
)

del files.txt
@echo ######## Create Names Database Successed!!! #########
pause

 

;#################################################################

 

fnd.bat:

@echo off

dir files/ /b >tmp.txt

for /f %%i in (tmp.txt) DO (
    find /i /n "%1" files/%%i
)

del tmp.txt

 

以上有2個bat文件,crt.bat是生成對應lib文件夾中的所有lib的符號,分別放在若幹個文本

文件中。隻要lib不發生變動,那麼隻要生成一次即可!然後使用fnd.bat來查詢某個符號。

that's all!!!

 

那麼使用ruby能否完成這一功能呢?答案是肯定的:

class LibSyms attr_accessor :libs def save_syms(fname="cache_syms.dat") data = Marshal.dump(@syms) File.open(fname,"w+b") {|f|f.puts data} end def load_syms(fname="cache_syms.dat") data=nil File.open(fname,"r+b"){|f|data=f.read} @syms=Marshal.load(data) end def enum_syms @syms={} @libs = [] `dir /"#{@path}//lib/" /b`.lines {|line|@libs<<@path+"//lib//"+line.chomp} @libs.each do |fname| tmp=`/"#{@path}//bin//nm.exe/" -s -D /"#{fname}/"`.split("/n") @syms[fname]=tmp end end def initialize(name,path,fname="cache_syms.dat") @name,@path=name,path if File.exist?(fname) p "find syms file,try to load!" load_syms(fname) else p "no find syms file,try to enum and save!" enum_syms save_syms(fname) end end def find(sym2find) p "into %s"%__callee__ @syms.each do |fname,syms| finded = syms.find_all do |sym| sym =~ /#{sym2find}/i end (p "find at #{fname} :";puts finded;p "/n") unless finded.empty? end end end $ls=LibSyms.new('gcc','C:/Program Files/MinGW5.1.6') loop do print "input a sym to check:" sym=gets case sym when /^quit$/i;break else;$ls.find(sym.chomp) end end

 

class LibSyms使用了批處理文件中類似的緩存機製,在無變動的情況下隻會執行

一次昂貴耗時的動作!

最後更新:2017-04-02 05:21:04

  上一篇:go magento 開發 -- 新增一個簡單的退貨流程
  下一篇:go magento開發 -- 支持多店鋪係統的開發