|
from http://blog.csdn.net/dreamfreelancer/article/details/4216147 編譯器:G++
1.link順序 GCC Link程序在.o文件列表中查找被引用實(shí)體(函數(shù)或Class)時(shí)不設(shè)定順序,即引用實(shí)體所在.o文件出現(xiàn) 在被引用實(shí)體所在的.o文件的左側(cè),或右側(cè)都能通過編譯,不會(huì)出現(xiàn)找不到引用的錯(cuò)誤 文件必需出現(xiàn)在引用實(shí)體所在.a文件的右側(cè),否則,將報(bào)“未定義引用(undefined reference)”錯(cuò)誤 2.重復(fù)引用的處理 你可能認(rèn)為這是個(gè)常識(shí)問題:編譯器報(bào)多重定義的錯(cuò)。事實(shí)果真如此嗎?正確答案:取決于你編譯命令行 怎么寫。 現(xiàn)的實(shí)現(xiàn)。 情況將不同,實(shí)際被引用的是按照打包順序,從左向右,出現(xiàn)在引用實(shí)體右側(cè)的第一個(gè)實(shí)現(xiàn)。 測(cè)試過程如下: 2.在a.cpp中提供一個(gè)實(shí)現(xiàn)版本 3.在b.cpp中提供void f_a()并一實(shí)現(xiàn)版本 4.在c.cpp中實(shí)現(xiàn) 5.在main.cpp中call f_c() 6.測(cè)試Link順序 用實(shí)體在.o文件列表中無順序依賴 6.2 g++ -o main main.cpp c.a a.a通過編譯,得到正確結(jié)果,但g++ -o main main.cpp a.a c.a將通不 過編譯,報(bào)錯(cuò):undefined reference to `f_a()' -- 被引用實(shí)體在.a文件列表中有順序依賴,被引用 實(shí)體必需出現(xiàn)在引用實(shí)體的左側(cè) 7.測(cè)試多重實(shí)現(xiàn) definition of `f_a()'--在.o列表中若存在多重定義,編譯將失敗 7.2 g++ -o main main.cpp a.a b.a c.a報(bào)錯(cuò):undefined reference to `f_a()'--符合上面關(guān)于Link 順序的測(cè)試; g++ -o main main.cpp c.a b.a a.a,通過編譯,實(shí)際引用b.a中的實(shí)現(xiàn); g++ -o main main.cpp c.a a.a b.a, 通過編譯,實(shí)際引用a.a中的實(shí)現(xiàn)。 7.3 g++ -o main main.cpp cc.a a.o b.a, 通過編譯,實(shí)際引用a.o中的實(shí)現(xiàn)版本--.o中的實(shí)現(xiàn)被引用 的優(yōu)先級(jí)高于.a;g++ -o main main.cpp c.a b.a a.o, 編譯出錯(cuò),報(bà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,通過編譯, 實(shí)際引用a.o中的實(shí)現(xiàn)--引用實(shí)體與被引用實(shí)體有的出現(xiàn)在.a中,有的出現(xiàn)在.o中,且存多重定義的情形 是有些復(fù)雜的,實(shí)際工作中應(yīng)謹(jǐn)慎處理 7.4 將多個(gè).o打成一個(gè).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,編譯通過,實(shí)際引用a.o實(shí)現(xiàn),g++ -o main main.cpp cc.o ba.a,編譯通過,實(shí)際引用b.o實(shí)現(xiàn); g++ -o main main.cpp abc.a,通過編譯,實(shí)際引用 a.o實(shí)現(xiàn);g++ -o main main.cpp bac.a,通過編譯,實(shí)際引用b.o實(shí)現(xiàn);g++ -o main main.cpp acb.a,通 過編譯,實(shí)際引用b.o實(shí)現(xiàn); g++ -o main main.cpp abc.a,通過編譯,實(shí)際引用a.o實(shí)現(xiàn);g++ -o main main.cpp bac.a,通過編譯,實(shí)際引用b.o實(shí)現(xiàn)
|
|
|