日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

GCC的Link行為

 心不留意外塵 2016-04-15

from http://blog.csdn.net/dreamfreelancer/article/details/4216147

編譯器:G++
OS:LINUX

 

1.link順序

GCC Link程序在.o文件列表中查找被引用實體(函數(shù)或Class)時不設(shè)定順序,即引用實體所在.o文件出現(xiàn)

在被引用實體所在的.o文件的左側(cè),或右側(cè)都能通過編譯,不會出現(xiàn)找不到引用的錯誤
但若從.a文件列表中搜索被引用實體,情況將不同,總是則從右向左順序查找,因此,被引用實體所在.a

文件必需出現(xiàn)在引用實體所在.a文件的右側(cè),否則,將報“未定義引用(undefined reference)”錯誤

2.重復(fù)引用的處理
若同一實體分別在兩個以上.o或.a文件中被實現(xiàn),Link時又同時指定了這些.o或.a文件,結(jié)果會怎么樣?

你可能認(rèn)為這是個常識問題:編譯器報多重定義的錯。事實果真如此嗎?正確答案:取決于你編譯命令行

怎么寫。
若指定.o文件列表,你的常識是對,編譯器報多重定義的錯(multiple definition)。
但若指定.a文件列表,你的常識將是錯的,編譯器并不報錯,而是引用.a文件列表中,從若向左第一次出

現(xiàn)的實現(xiàn)。
引用實體和被引用實體混合出現(xiàn)在.o, .a的文件中時情況較復(fù)雜,大體符合.o優(yōu)先的原則
引用與被引用實體分別所在的.o被打包成一個.a時,打包時.o沒有順序依賴,但當(dāng)其中存在多重定義時,

情況將不同,實際被引用的是按照打包順序,從左向右,出現(xiàn)在引用實體右側(cè)的第一個實現(xiàn)。

測試過程如下:
1.在a.h文件中定義一個函數(shù):
void f_a();

2.在a.cpp中提供一個實現(xiàn)版本
void f_a()
{
   printf("hello f_a from a.cpp/n");
}
編譯成a.o, 并ar rsuv a.a a.o成a.a

3.在b.cpp中提供void f_a()并一實現(xiàn)版本
void f_a()
{
  printf("hello f_a from b.cpp/n");
}
編譯成b.o, 并ar rsuv b.a b.o成b.a

4.在c.cpp中實現(xiàn)
void f_c()
{
  printf("f_c will call f_a.../n");
  f_a();
}
編譯成c.o, 并ar rsuv c.a c.o成c.a

5.在main.cpp中call f_c()
int main(int argc, char **argv)
{
 f_c();
 return 0;
}

6.測試Link順序
6.1 g++ -o main main.cpp a.o c.o或g++ -o main main.cpp c.o a.o將得到同樣的正確的結(jié)果--被引

用實體在.o文件列表中無順序依賴

6.2 g++ -o main main.cpp c.a a.a通過編譯,得到正確結(jié)果,但g++ -o main main.cpp a.a c.a將通不

過編譯,報錯:undefined reference to `f_a()' -- 被引用實體在.a文件列表中有順序依賴,被引用

實體必需出現(xiàn)在引用實體的左側(cè)

7.測試多重實現(xiàn)
7.1 g++ -o main main.cpp a.o b.o c.o(a.o, b.o, c.o任意排列組合),編譯將失敗,報錯:multiple

definition of `f_a()'--在.o列表中若存在多重定義,編譯將失敗

7.2 g++ -o main main.cpp a.a b.a c.a報錯:undefined reference to `f_a()'--符合上面關(guān)于Link

順序的測試; g++ -o main main.cpp c.a b.a a.a,通過編譯,實際引用b.a中的實現(xiàn); g++ -o main

main.cpp c.a a.a b.a, 通過編譯,實際引用a.a中的實現(xiàn)。

7.3 g++ -o main main.cpp cc.a a.o b.a, 通過編譯,實際引用a.o中的實現(xiàn)版本--.o中的實現(xiàn)被引用

的優(yōu)先級高于.a;g++ -o main main.cpp c.a b.a a.o, 編譯出錯,報“多重定義(multiple definition

of `f_a()')”; g++ -o main main.cpp b.a c.a a.o或g++ -o main main.cpp b.a a.o c.a,通過編譯,

實際引用a.o中的實現(xiàn)--引用實體與被引用實體有的出現(xiàn)在.a中,有的出現(xiàn)在.o中,且存多重定義的情形

是有些復(fù)雜的,實際工作中應(yīng)謹(jǐn)慎處理

7.4 將多個.o打成一個.a(文件名體現(xiàn)打包順序),g++ -o main main.cpp ac.a或g++ -o main main.cpp

ca.a, 通過編譯; g++ -o main main.cpp cc.o ab.a,編譯通過,實際引用a.o實現(xiàn),g++ -o main

main.cpp cc.o ba.a,編譯通過,實際引用b.o實現(xiàn); g++ -o main main.cpp abc.a,通過編譯,實際引用

a.o實現(xiàn);g++ -o main main.cpp bac.a,通過編譯,實際引用b.o實現(xiàn);g++ -o main main.cpp acb.a,通

過編譯,實際引用b.o實現(xiàn); g++ -o main main.cpp abc.a,通過編譯,實際引用a.o實現(xiàn);g++ -o main

main.cpp bac.a,通過編譯,實際引用b.o實現(xiàn)

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多