簡體   English   中英

為什么gcc鏈接程序對.a文件和.o文件的行為有所不同?

[英]Why does the gcc linker behave differently with .a files and .o files?

使用有關gcc中鏈接順序的出色答案中的示例,我嘗試了以下操作:

echo 'extern int b; int a = b;' > b.cpp
g++ -c b.cpp -o b.o
ar cr libb.a b.o

echo 'int b;' > d.cpp
g++ -c d.cpp -o d.o
ar cr libd.a d.o

echo 'extern int a; int main() { return a; }' > a.cpp

g++ a.cpp -o a1 d.o b.o # Works
g++ a.cpp -o a2 libd.a libb.a # Fails

如果.a文件只是一個包含一個或多個.o文件的存檔文件,則如何與lib*.a文件鏈接(按原始答案中所述的錯誤順序)失敗,而是直接使用.o文件(以相同的順序)有效嗎?

就鏈接器而言,鏈接序列中靜態庫和目標文件之間的區別是:

  • 要鏈接目標文件,僅因為它是一個目標文件,無論它是否提供可執行文件所需的任何符號的定義。 如果您不希望鏈接目標文件,請不要在鏈接器中提及它。

  • 靜態庫是要從庫中提取並在需要時鏈接的目標文件的歸檔,其中,當且僅當它提供了至少一個鏈接器具有的迄今未定義符號的定義時,才需要庫中的目標文件在目標文件或庫前面的聯動序列出現觀察到。

暫無
暫無

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

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