如何排查C++鏈接庫之間鏈接順序問題

今天浪費了8個小時排查了一個 C++ 庫編譯後依賴的cuda符號找不到的問題。後面在湊巧的情況下在 鏈接庫的地方加了一個可能會用到的庫,結果就通過了。但是湊巧肯定是有更深刻的原因,再反覆驗證,實際上是這樣的:

link(A)
link(B)
link(mm)

我加的 mm 庫後鏈接就通過了。但是 mm 是沒有理由要加的。另外一個人這樣寫也不行

link(mm)
link(A)
link(B)

這是一個奇怪的問題,我就去看了 mm 庫裏做了啥,就是沒看出有啥特別的。但是A實際上是一組link庫的變量名,我再打印了 A,發現A裏面就含有 mm。

於是我改成

link(B)
link(A)

就通過了,不需要手工加 mm

這個解決了後,我感覺獲得了一個經驗,B以後應該都寫在A之前。

但是,這是知識麼?這他媽是老中醫。於是我又去問了下GPT,如何判斷多個鏈接庫之間的依賴順序。GPT這個很複雜,不能那麼容易搞定,但是推薦我可以用 ldd 命令先看下一個庫鏈接了那些其他庫。

於是我就嘗試了下 ldd mm, 它就列出了

  libxxx1=> not found
  libxxx2=-> not found 
  ...

這下就清楚多了,雖然不是自動的,但是在分析的時候判斷就容易多了,有依據了,不是靠猜來解決問題了。

如果我有時間,還可以寫一個Python腳本來做這個事情。如果有很多A和小庫的詳細映射和經驗依賴關係配置。那麼當需要多個鏈接的時候,也是可以快速給出更靠譜的順序分析建議。不需要 100%解決問題,如果能 90%就可以節省大量時間。

畢竟 make build 下都要等好久。

--end--

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章