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)