2011
Dec
30

在編譯 c 語言,symbol lookup error 的錯誤可是常常出現的,這到底是什麼問題,為什麼我只是想寫一段短短的 code ,編譯器要這樣搞我呢。

問題: symbol lookup error: /usr/local/lib/libxxic.so: undefined symbol: _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS

最近升級 Gcc 版本,從 3.4 升到 4.2 ,本來以為只有把 gcc與g++ 執行檔復製到 /usr/bin 就沒事了,沒想到最近在編譯 c++語言時,因為有用到 iostream 的語法,結果執行的時候,卻出現 symbol lookup error ,在強力的追查之下,發現原來是新版的 gcc 有自已的 libstdc++ library,所以 library 也要跟著更新版本才行,那為什麼編譯時,可以過關呢,請看下列說明。

c++ 在編譯程式的時候,都會自動將 function的名稱改成另一個只有 C++ 自已知道的名稱,這是為了 overloading 的功能,所謂的 overloading,是指同一個 function 名稱,可以接受多種不同的參數,c++ 為了區分這些同 function不同參數,而自行將 function 改變成另一個名稱,並且在不同的編譯器,編譯出來的名稱是不同的,我們就先來看兩個不同版本的 gcc 編譯過程。

gcc 3.4

這邊是 gcc3.4編譯出來的程式碼

  1. void test(int a); //=> 編譯成 void test_1(int a);
  2. void test(char a);// => 編譯成 void test_2(char a);

gcc 4.2

這邊是 gcc4.2編譯出來的程式碼

  1. void test(int a);// => 編譯成 void test_1000(int a);
  2. void test(char a);// => 編譯成 void test_2000(char a);

結論

因為兩個版本的gcc編譯出來的functoin名稱是不同的,所以當你呼叫 test時,若是載入錯誤版本的 library,就會發生 symbol link error ,而編譯的時候,因為function名稱還沒有被更動,所以就 make 成功囉。


回應 (Leave a comment)