簡體   English   中英

動態鏈接庫中如何處理“外部”變量?

[英]How 'extern' variables are handled in dynamically linked libraries?

最近,我將自己的庫(用於打包)更改為STATIC。 現在,我收到錯誤消息,指出在庫中定義的變量被乘以定義。 可以,這些庫可以互相使用。 但是,為什么在我更改為STATIC之前,鏈接器沒有注意到這一點? 在我的一個文件中,我將聲明為“ extern”的變量設置為變量,鏈接器還將其標記為“乘以定義”。 可以嗎

基本上,編譯器有四個階段:

預處理:宏和符號版

編譯:生成要由處理器執行的匯編代碼

組裝:生成機器可以理解的二進制代碼(0/1二進制代碼)

鏈接:前面的三個操作是針對每個文件分別完成的,但是我們需要在這里對整個項目的每個變量,指針,函數的地址映射進行編輯,如果我們在對變量有多個定義的時候會遇到一些問題,因為鏈接會檢查所有文件並為整個項目生成輸出。

如果一個庫被聲明為靜態的,則該庫中已聲明和定義的函數要等到運行時才能使用,但在編譯時不允許在其他文件中使用該庫,因此,在這種情況下,我們會得到錯誤提示在鏈接階段,因為編譯器會找出另一個文件不允許在此靜態庫中使用該函數的情況。

如果您希望它是靜態的,則可以使用運行時概念來使用此庫(例如,在C語言中,可以使用指向函數的指針)。

但是,為什么在我更改為STATIC之前,鏈接器沒有注意到這一點?

運行時鏈接程序允許重復的符號定義(在運行時僅使用一個,這是符號插入 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM