链接报错undefined reference to + libc++和libstdc++

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++标准库同步。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值