回歸正題,前段時間專案開發中,實現了乙個動態庫,封裝了一些方法。然後基於這個動態庫,實現了乙個應用程式。應用程式中含有全域性變數a,動態庫中也含有全域性變數a,當我呼叫動態庫中函式後,發現應用程式的a發生了變化!!!o,my god!對於我這種還沒在linux下做過開發的人來說,一頭霧水。。。。。。 於是我嘗試著,將a中的變數名稱改為b,這樣問題也就沒有了~~~
應用程式進行鏈結的時候,動態庫中全域性變數定義,將會被應用程式中同名的全域性變數所覆蓋。這樣也就造成了,在動態庫中修改a變數時,應用程式中的a也發生了變化。
在建立動態鏈結庫時,gcc/g++選項中新增編譯選項
-wl,-bsymbolic.
其中wl
表示將緊跟其後的引數,傳遞給聯結器
ld。bsymbolic
表示強制採用本地的全域性變數定義,這樣就不會出現動態鏈結庫的全域性變數定義被應用程式的同名定義給覆蓋了!
linux so 動態庫中全域性變數 被覆蓋問題
回歸正題,前段時間專案開發中,實現了乙個動態庫,封裝了一些方法。然後基於這個動態庫,實現了乙個應用程式。應用程式中含有全域性變數a,動態庫中也含有全域性變數a,當我呼叫動態庫中函式後,發現應用程式的a發生了變化!o,my god!對於我這種還沒在linux下做過開發的人來說,一頭霧水。於是我嘗試著,...
動態庫中,關於全域性變數的呼叫
測試目的 動態庫中全域性變數的使用方法 測試結果 主程式和庫b共用一套a的動態庫,共用一套全域性變數。庫a的 includeint pri 0 void fun void change 編譯 gcc shared sa.c o libsa.so 庫b的 include includevoid fun...
static全域性變數 全域性變數
1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...