1 问题现象
subscribe(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
描述:编译的时候,最后的链接中一直没成功
2 可能原因
2.1 链接时缺失了相关目标文件(.o)
eg: main.o中有func需要链接 func1.o,缺少了func1.o
2.2 链接时缺少相关的库文件(.a/.so)
2.3链接的库文件中又使用了另一个库文件,库嵌套链接别的库
把需要链接的库都补上,可以用readelf -d .so 查看该库还链接了其他的啥库
2.4多个库文件链接顺序问题
要求顺序:cmake中链接库,依赖其他库的库一定要放到被依赖库的前面
2.5在c++代码中链接c语言的库
main.cpp 的c++ 代码链接库中的函数是由c代码生成的;
导致: main.cpp 为 c++ 代码,调用了 c 语言库的函数,因此链接的时候找不到;
解决方法:链接的库对应的头文件中API 添加一个 extern “C” 的声明,重新编译后的库进行main.o链接
2.6 两端的gcc版本对应的libstdc++版本不一致
原因说明:需要链接库的main编译环境使用的编译器gcc版本的libstdc++版本和提供的库(被链接的)编译环境中使用的gcc版本的libstdc++版本不一致;
解决方法:同步gcc版本的同时同步libstdc++版本,具体步骤如下:
2.6.1升级gcc保持同步
如果升级gcc后还是编译链接不通过,查看下libstdc++版本进行单独的升级,首先下载自己需要的libstdc++.so.6.0.xx版本,放在usr/lib64后,执行
rm -rf /usr/lib64/libstdc++.so.6
ln -s libstdc++.so.6.0.26 libstdc++.so.6
2.7链接了使用不同的_GLIBCXX_USE_CXX11_ABI宏编译的目标,导致main链接不到库的func
解决方法:cmake指定链接版本,尝试显示定义main编译的目标宏,同步main和库的编译宏定义
2.8 main和被链接的库分别使用libstdc++、libc++两套不同的c++标准库
说明:
在C++编译中,编译器需要链接到一个C++标准库来提供标准模板、函数、容器等。不同的编译器可能提供不同的库实现,例如:
GNU的libstdc++:GCC编译器的标准C++库。
LLVM的libc++:Clang编译器的标准C++库。
Microsoft的MSVC STL:Visual C++编译器的C++标准库。
解决方法:main和被链接的库和对方使用的c++标准库同步。