Bootstrap

centos 下调用libnanolog.so时的“ undefined reference to `std::thread::_M_start_thread ”错误

背景

当前项目中通过 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),要么就是这种版本问题;

;