在编译 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编译出来的functoin名称是不同的,所以当你呼叫 test时,若是载入错误版本的 library,就会发生 symbol link error ,而编译的时候,因为function名称还没有被更动,所以就 make 成功罗。