前段時間項目開發中,實作了一個動态庫,封裝了一些方法。然後基于這個動态庫,實作了一個應用程式。應用程式中含有全局變量A,動态庫中也含有全局變量A,當我調用動态庫中函數後,發現應用程式的A發生了變化!!!O,My God!對于我這種還沒在Linux下做過開發的人來說,一頭霧水。。。。。。 于是我嘗試着,将A中的變量名稱改為B,這樣問題也就沒有了~~~
應用程式進行連結的時候,動态庫中全局變量定義,将會被應用程式中同名的全局變量所覆寫。這樣也就造成了,在動态庫中修改A變量時,應用程式中的A也發生了變化。
在建立動态連結庫時,gcc/g++選項中添加編譯選項
-Wl,-Bsymbolic.
其中Wl表示将緊跟其後的參數,傳遞給連接配接器ld。Bsymbolic表示強制采用本地的全局變量定義,這樣就不會出現動态連結庫的全局變量定義被應用程式/動态連結庫中的同名定義給覆寫了