我正在研究一個有'核心'和多個插件的應用程序。我在Linux上使用Qt,並使用Qt的插件加載器系統。插件被創建爲共享對象文件(* .so)並動態加載。如果我使用插件鏈接到庫,並且該庫鏈接到其他庫,我經常會從應用程序中收到「未定義符號」錯誤。要解決它,我需要插件C++爲什麼這種特定情況會導致符號鏈接錯誤?
插件鏈接鏈接到其他庫,以及...以力霸
力霸鏈接到LibB,的LibC
力霸被編譯爲靜態的。當我嘗試加載插件,我會得到一個未定義的符號錯誤,就像這樣:
unable to load shared library 'myPluginName.so':
myPluginName.so: undefined symbol: _ZN3BlahBlahD2Ev
爲了解決這個問題,我可以使用FILT到unmangle符號名稱,找出哪些庫在符號所屬(比方說LibB),然後編譯,如:
插件鏈接,力霸,LibB
力霸鏈接到LibB,的LibC
我不知道爲何出現錯誤。如果LibA鏈接到LibB和LibC,Plugin爲什麼還必須「瞭解」LibB?爲什麼在所有情況下都不會出現這種錯誤(即沒有與使用LibC的未定義符號相關的錯誤)?
我會很感激任何輸入。
-kf
如果將LibA構建爲靜態庫,它不應該有任何動態依賴關係,對吧? (如果我在這裏感到困惑,請糾正我)無論如何,如果你在Linux上,你應該能夠在你的plugin.so上運行'ldd',看看是否有任何未解決的庫引用...如果不是,還有其他事情正在發生。 –