今天浪費了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--