相見恨晚 linux下的c filt 命令

2021-07-24 12:21:46 字數 985 閱讀 1932

乙個簡單的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來指定庫了, 醬紫就解決問題了

**:

相見恨晚 linux下的c filt 命令

乙個簡單的linux命令,確實不值得大費周折,但是,如果能與實際開發工作聯絡起來,解決實際開發中的困惑,在生動的實際場景中學習命令,那無疑是棒棒噠的感覺 我們知道,在c 中,是允許函式過載的,也就引出了編譯器的name mangling機制,今天我們要介紹的c filt命令便與此有關。對於從事lin...

Matlab中相見恨晚的命令(持續更新)

知乎上有個 有哪些讓人相見恨晚的matlab命令 的話題,很多答主提供的命令確實很實用,為了更方便大家的學習,我就知乎上的答案和我自己想到的都綜合整理成了一篇文章,把我覺得很實用的指令整理出來。知乎原答案鏈結 如果執行出錯,matlab會自動停在出錯的那一行,並儲存相關變數,非常好用的指令,誰用誰知...

Python 中的哪些庫讓你相見恨晚

相見恨晚的庫有很多啊 決定利用午休的時間,把曾經驚豔過我的庫都整理出來好了 還不勇敢的點讚麼親 馬上為你呈上一鍋熱騰騰的美味,噹噹噹噹 web框架 django flask tornado bottle werobot 網路 requests 爬蟲 scrapy 系統方面 fabric ansibl...