廣告贊助


        一個簡單的linux命令, 確實不值得大費周折, 但是, 如果能與實際開發工作聯系起來, 解決實際開發中的困惑, 在生動的實際場景中學習命令, 那無疑是棒棒噠的感覺得意    
       最近剛好用c++filt解決了相關實際問題, 故而分享如下:

      我們知道, 在C++中, 是允許函數重載的, 也就引出了編譯器的name mangling機制, 今天我們要介紹的c++filt命令便與此有關。
      對於從事linux開發的人來說, 不可不知道c++filt命令的使用。

      在linux開發中, 如果要調用基礎模塊庫, 就要包含對應的頭文件, 並在makefile中指定頭文件路徑和對應的庫。
       之前我們說過了:
      1. 如果沒有指定對應的頭文件, 則編譯會報錯, 提示找不到頭文件。 
      2. 如果指定了庫路徑, 但實際沒有庫, 則會報找不錯庫文件的錯誤。 
      3. 如果沒有指定庫路徑(因各種原因啦), 則編譯不會報錯, 運行的時候才會報錯, 提示dlopen失敗。

      針對3中的問題, 我們之前也說過, 完全不用等到運行階段才去發現問題, 我們可以在編譯出so庫後, 用ldd -r命令來找出undefined的函數名(當然也可以用nm命令), 比如用ldd -r test.so查出缺少_ZNK4Json5ValueixEPKc(這就是name mangling後的函數名), 那怎麼知道這個name mangling後的名字的原函數名稱呢?  我們可以大致猜測, 但這並不靠譜, 怎麼辦呢?c++file命令就是專門干這個的, 如下:
[plain] view plain copy
[taoge@localhost test]$ c++filt _ZNK4Json5ValueixEPKc  
Json::Value::operator[](char const*) const  
      這樣, 就更清楚是哪個函數了。 然後就可以在工程中搜索了, 然後就可以找到對應的庫了, 然後就可以修改makefile來指定庫了, 醬紫就解決問題了

      就這樣。

      後記: 我之前一直想找到一個從name mangling後的名字來找原函數的方法, 沒想到c++filt命令早已實現。 遇上你, 真美麗羨慕羨慕羨慕





from:
http://blog.csdn.net/stpeace/article/details/51416297


創作者介紹
創作者 天才R 的頭像
天才R

做 個 有 趣 的 人

天才R 發表在 痞客邦 留言(0) 人氣()