乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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ā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多