曾經在一次寫程序的時候,全局使用一個日志對象,所有的日志信息都由此日志對象寫入文件。但是發現在動態鏈接庫里,無法存取到該全局對象,后經查找資料。發現,動態鏈接庫是否能存取主程序的全局變量,主程序是否能存取動態鏈接庫里定義的全局變量都是可以通過鏈接指令改變此行為。
主程序存取動態鏈接庫里的全局變量
例如動態庫里定義全局變量int i, 在主程序里申明extern int i。 則,主程序存取的就是動態庫里定義的i。在所有的UNIX平臺上這是默認的行為(注意:實際定義i的 模塊的點o文件,必須同時鏈接到動態庫和主程序上,否則鏈接報錯)。
如果不想讓主程序能存取動態庫里的全局變量,則在鏈接動態連接庫的時候,給gcc傳入-Wl,-Bsymbolic即可。
動態連接庫存取主程序里定義的全局變量 在linux上,鏈接主程序的時候,使用參數-Wl,--export-dynamic 在AIX上,使用'deferred imports' 并且 enable 'runtime linking'. |