我有以下設置:靜態庫鏈接兩次
- 靜態庫
- 鏈接到鏈接到(1)(1)
- 的可執行文件和動態庫( 2.)
來自靜態庫的代碼現在被複制並存在於動態庫和可執行文件中。
問題:
是數據(全局變量,靜態類成員)也複製並執行可執行文件和DLL看到相同的數據?
Linux和Windows之間有區別嗎?
你會如何解決這個問題?
編輯:
感謝您的答案,我無法解釋我的情況下發生的事情完全一樣。
靜態庫沒有導出/導入標誌。 動態庫帽子導出自己的符號。
的Windows:
動態庫有靜態庫的文本+數據segement的副本。 可執行程序無法知道動態庫是否鏈接了靜態庫,因爲靜態庫符號的非外部可見。
的Linux:
動態庫有靜態庫的文本數據segement的副本。 雖然動態庫包含靜態庫中的所有符號(文本和數據),但它們在其自己的符號表中。 - >可執行文件看到,動態庫已經定義了靜態庫的所有符號,並且沒有重新定義它們。
這很糟糕,因爲您通常需要在Linux和Windows上使用相同的行爲。
分享符號(在Linux默認)
- 上所有的符號連接起來,共享庫時,添加DLL導出命令,從靜態庫。
__attribute__ ((dllexport))
- 將靜態庫鏈接到可執行文件時添加一個dll導入命令。
__attribute__ ((dllimport))
- 的代碼和數據只存在於共享庫,並從外面
- 上所有的符號連接起來,共享庫時,添加DLL導出命令,從靜態庫。
Reduntant符號可鏈接(在Windows默認)
- 你需要確保的符號靜態庫不包含在共享庫的符號表中
__attribute__ ((visibility ("hidden")))
on gcc- 當鏈接可執行文件時,來自靜態li brary不能在任何地方找到,所以他們再次被包括在內。
是的,數據是重複的。你可以通過使用動態庫來解決它。 – UmNyobe
@UmNyobe:已經有一個DLL;創造另一個將是沒有幫助的,因爲它不會與第一個共享全球數據。 –
庫是否預編譯或可用作源代碼? –