from http://blog.csdn.net/dreamfreelancer/article/details/4216147 編譯器:G++
1.link順序 GCC Link程序在.o文件列表中查找被引用實體(函數(shù)或Class)時不設(shè)定順序,即引用實體所在.o文件出現(xiàn) 在被引用實體所在的.o文件的左側(cè),或右側(cè)都能通過編譯,不會出現(xiàn)找不到引用的錯誤 文件必需出現(xiàn)在引用實體所在.a文件的右側(cè),否則,將報“未定義引用(undefined reference)”錯誤 2.重復(fù)引用的處理 你可能認(rèn)為這是個常識問題:編譯器報多重定義的錯。事實果真如此嗎?正確答案:取決于你編譯命令行 怎么寫。 現(xiàn)的實現(xiàn)。 情況將不同,實際被引用的是按照打包順序,從左向右,出現(xiàn)在引用實體右側(cè)的第一個實現(xiàn)。 測試過程如下: 2.在a.cpp中提供一個實現(xiàn)版本 3.在b.cpp中提供void f_a()并一實現(xiàn)版本 4.在c.cpp中實現(xiàn) 5.在main.cpp中call f_c() 6.測試Link順序 用實體在.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) 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)
|
|