查看本机glibc版本:
ldd --version
----------------------------
在A机器编译的库,给B使用时报: undefined reference to `expf@GLIBC_2.27'
用上面命令查看后,
A的版本: ldd (Ubuntu GLIBC 2.27-3ubuntu1.2) 2.27
B的版本: ldd (Ubuntu GLIBC 2.23-0ubuntu11) 2.23
进一步查找资料:
The highest glibc version available in Ubuntu 16.04 (as of July 2019) is 2.23,
but the linker is stating your version is 2.27, which suspiciously corresponds to the one shipped in Ubuntu 18.04
用如下命令查看so库的glibc依赖
nm mylib.so | grep GLIBC_2.27
发现如下:
用如下命令查看使用说明
man expf
继续比对新老版本的m库:
// ubuntu 18.04:
objdump -T /lib/x86_64-linux-gnu/libm-2.27.so | grep "expf"
// ubuntu 16.04:
objdump -T /lib/x86_64-linux-gnu/libm-2.23.so | grep "expf"
------------------------------------------------------------------------------------------
以下为老版回答
------------------------------------------------------------------------------------------
尝试降低GCC版本,
B的GCC为 5.4.0 ,
A为Ubuntu18.04 , gcc为7.3.0 ,支持的最低gcc版本为 5.5.0
尝试安装
查看支持的最低版本
apt-cache policy gcc-5
一、利用软链接的方式进行gcc的降级
1、apt-get安装gcc、g++,默认下载最新版本的,此时ubuntu里的gcc和g++版本均为7.3.0。
sudo apt-get install gcc
sudo apt-get install g++
gcc -v //查看的版本为7.3.0
g++ -v //查看的版本为7.3.0
2、apt-get 安装gcc、g++ 5版本,利用apt-get 安装gcc5.4.0版本时显示没有该版本资源,因此改为gcc.5版本。
sudo apt-get install -y gcc-5
sudo apt-get install -y g++-5
gcc-5版本已经下载好,通过下载时输出的信息来看下载的版本实际为gcc 5.5.0-12ubuntu1
3、删除原有gcc链接,重新建立软链接。
cd /usr/bin
sudo rm -r gcc //移除之前的软链接
sudo ln -sf gcc-5 gcc // 建立gcc-5的软链接 此处尝试使用gcc-5.5.0,但是报错
sudo rm -r g++ //同上
sudo ln -sf g++-5 g++ //同上
4、此时,gcc的版本已经成功的从7.3.0下降到5.5.0版本,利用gcc -v查看版本号发现已经更新为gcc 5.5.0。
上处软链接时使用的时gcc-5,显示的版本为gcc 5.5.0,考虑原因应该时在使用apt-get下载时使用的是gcc-5的原因。
可以用!
=======================================================================
尝试升级ubuntu16.04的glibc
sudo apt-get install bison
进入glibc-2.33源码:
mkdir build
cd build
../configure --prefix=/opt/
make -j4
make install
其中../configure --prefix=/opt/时报错checking LD_LIBRARY_PATH variable... contains current directory
echo $LD_LIBRARY_PATH
#看出来的是什么,比如是/home/yxp/grpc/opencv/lib:
#则:
export LD_LIBRARY_PATH=/home/yxp/grpc/opencv/lib
开始制作软连接: