背景
当前项目中通过 libnanolog.so 来记录log,但是在编译时,出现以下错误:
包含如下错误:
/workspace/AutoClose/unit_tests/lib/centos/libnanolog.so: undefined reference to
`std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)())@GLIBCXX_3.4.22'
/workspace/AutoClose/unit_tests/lib/centos/libnanolog.so: undefined reference to
`operator delete(void*, unsigned long)@CXXABI_1.3.9'
/workspace/AutoClose/unit_tests/lib/centos/libnanolog.so: undefined reference to
`std::thread::_State::~_State()@GLIBCXX_3.4.22'
/workspace/AutoClose/unit_tests/lib/centos/libnanolog.so: undefined reference to
`typeinfo for std::thread::_State@GLIBCXX_3.4.22'
collect2: error: ld returned 1 exit status
make[2]: *** [unit_tests/bin/test_aot_signal] Error 1
make[1]: *** [unit_tests/aot_signal/CMakeFiles/test_aot_signal.dir/all] Error 2
make: *** [all] Error 2
排除掉cmakelist文件里没有添加 pthread 编译选项的问题之后,基本确定是glibc版本导致的
解决
先查看一下当前的 libstdc++.so.6 的链接指向:
[root@09de35f53b68 lib64]# ll -s libstdc++.so.6
0 lrwxrwxrwx 1 root root 19 Feb 25 00:52 libstdc++.so.6 -> libstdc++.so.6.0.19
可以看到当前指向的是19版本,首先备份一下当前的版本:
mv libstdc++.so.6 libstdc++.so.6_19
从文龙出拷贝一个24版本的 libstdc++.so.6.0.24 ,拷贝到docker的 /usr/lib64 目录下,然后重定向:
ln -s libstdc++.so.6.0.24 libstdc++.so.6
再重新编译即可;
总结
编译问题,出现未找到符号,要么是低级的未定义问题(一般出现在自己的代码里),要么是编译选项问题(未连接某个so),要么就是这种版本问题;