����

程序运行时到底使用哪个位置的动态链接库 LD_LIBRARY_PATH会应影响ldd命令的输出结果, ldd输出的是程序运行和编译时的搜索路径,务必保持编译时和运行时动态库使用的是同一个 否则容易导致undefined symbol:错误

ldd 查看文件链接了哪些动态链接库及其链接路径 ldd 显示出的动态链接库路径一般是在系统路径中查找动态链接库文件名匹配到的路径, 如果程序在使用gcc时编译指定了rpath等参数,将显示程序链接库编译时的链接地址

查看libc.so.6 和libstdc++.so.6动态链接库支持的GLIBC 和GLIBCXX版本 strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC

gcc使用的GLIBC 版本是在编译时决定的, 这个GLIBC版本一般是编译gcc时使用的GLIBC版本。 用gcc编译出来的程序也会使用这个GLIBC版本 gcc和GLIBC版本对照关系 https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

当在旧系统上安装版本较新的gcc后, 使用版本较新的gcc编译出的程序也会使用较新版本的GLIBC版本,如果没有将系统的动态链接库更新到匹配的GLIBC版本,由于程序运行时会默认加载系统路径下的旧动态链接库,导致找不到新版本的GLIBC。 解决方法, 方法1: 把系统的动态链接库,使用包含新版本GLIBC的动态链接库替换掉 方法2: 在LD_LIBRARY_PATH的前边添加新版本GLIBC的动态链接库所在的路径 方法3: 使用系统动态链接库对应的系统默认gcc进行编译,而不是新版本gcc

设置LD_LIBRARY_PATH,再运行ldd, 就能看到程序运行时会加载哪个位置的链接库 LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:./lib ldd lib/libtensorflow_cc.so

有的时候设置了LD_LIBRARY_PATH,却没有影响到 ldconfig -p