python test.py
Traceback (most recent call last):
File "/home/tieren/libssp/build/test.py", line 1, in <module>
import ssp_python
ImportError: /home/tieren/libssp/build/ssp_python.cpython-310-x86_64-linux-gnu.so: undefined symbol: _ZN3imf9SspClientC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_4LoopEmtj
执行test.py,ssp_python需要libssp.so支持,但是在运行的时候,找不到相应的类了。
百度了很久,发现 是C++ Abi版本不一致导致的:
c++ Abi 版本不一致
Gcc 对 c++ 的新特性是一步一步的增加的,如果实现了新的特性,就可能会修改 c++ 的 abi,并且会升级 glibc 的版本。
Abi 链接最常见的错误是 std::string 和 std::list 的在gcc 4.x 和 gcc 5.x 的不同实现引起的。在gcc 4.x 时,gcc 对标准 string 的实现就放在 std 命名空间下,编译时展开为 std::basic_string 。但是 gcc 5.x 开始,对 string 的实现就放在了 std::__cxx11空间里,编译后展开为 std::__cxx11::basic_string 。这就会导致在 gcc 4.x 编译的动态库,假如有的函数使用了 string 作为参数或者返回值,这时导出的函数参数为 std::basic_string 类型。 无法在 gcc 5.x 下编译连接使用。
错误类似:
undefined symbol: "std::__cxx11 ***"
这种情况有一个折中办法就是在gcc 5.x 或以上 编译时,增加 -D_GLIBCXX_USE_CXX11_ABI=0
禁用 c++11 abi。
当然最好的做法就是保证编译器大版本基本一致。在新开发的程序如果用到了 c++ 的新特性,升级 gcc 版本和 glibc 是十分必要的。
原来代码中
#define _GLIBCXX_USE_CXX11_ABI 1
#include <functional>
#include <memory>
#include <thread>
#include <string>
#include <stdlib.h>
#include "imf/net/loop.h"
#include "imf/net/threadloop.h"
#include "imf/ssp/sspclient.h"
第一行的定义要改成0
这样问题就解决了