GCC 链接 xxx:No such file or directory 及运行可执行文件 error while loading shared libraries: xxx.so 解决方案
关于 GCC
提示找不到指定库文件的这个问题,通常出现在以下 2 个场景中:
- 利用静态库或者动态库文件实现链接操作(生成可执行文件)时,·
GCC
可能会提示xxx:No such file or directory
(其中xxx
表示查找失败的静态库或者动态库); - 执行借助动态库生成的可执行文件时,
GCC
可能会提示./main.exe: error while loading shared libraries: xxx.so: cannot open shared object file: No such file or directory
(其中xxx
表示动态库的文件名)。
1. GCC生成可执行文件时找不到库文件
要想彻底解决这个问题,读者就必须先了解在生成可执行文件时,GCC
编译器默认的查找库文件的路径。
程序链接阶段指明所用库文件的方式有 2 种。假设当前 mian.cpp
文件需要借助 libmyfunction.a
才能完成链接,则完成链接操作的 gcc
指令有以下 2 种写法:
wohu@ubuntu:~/cpp/src$ gcc -static main.c libmyfunction.a -o main.exe
wohu@ubuntu:~/cpp/src$ gcc -static main.c -lmyfunction -o main.exe
当以第一种写法完成链接操作时,GCC
编译器只会在当前目录中(这里为 demo 目录)查找 libmyfunction.a
静态链接库;反之,如果使用 -l
(小写的 L
)选项指明了要查找的静态库的文件名,则 GCC
编译器会按照如下顺序,依次到指定目录中查找所需库文件:
- 如果
gcc
指令使用-L
选项指定了查找路径,则GCC
编译器会优先选择去该路径下查找所需要的库文件; - 再到
Linux
系统中LIBRARY_PATH
环境变量指定的路径中搜索需要的库文件; - 最后到
GCC
编译器默认的搜索路径(比如/lib
、/lib64
、/usr/lib
、/usr/lib64
、/usr/local/lib
、/usr/local/lib64
等,不同系统环境略有差异)中查找。
如果读者使用第一种方法完成链接操作,但 GCC
编译器提示找不到所需库文件,表明所用库文件并未存储在当前路径下,解决方案就是手动找到库文件并将其移至当前路径,然后重新执行链接操作。
反之,如果读者使用的是第二种方法,也遇到了 GCC 编译器提示未找到所需库文件,表明库文件的存储路径不对,解决方案有以下 3 种:
- 手动找到该库文件,并在
gcc
指令中用-L
选项明确指明其存储路径。比如libmyfunction.a
静态库文件存储在/usr
目录下,则完成链接操作的gcc
指令应为
gcc -static main.c -L/usr -lmymath -o main.exe
- 将库文件的存储路径添加到
LIBRARY_PATH
环境变量中。仍以库文件存储在/usr
目录下,则通过执行
export LIBRARY_PATH=$LIBRARY_PATH:/usr
指令,即可将 /usr
目录添加到该环境变量中(此方式仅在当前命令行窗口中有效);
- 将库文件移动到
GCC
编译器默认的搜索路径中。
2. GCC运行可执行文件时找不到动态库文件
执行已生成的可执行文件时,如果 GCC
编译器提示找不到所需的库文件,这意味着 GCC
编译器无法找到支持可执行文件运行的某些动态库文件。
事实上,当 GCC
编译器运行可执行文件时,会按照如下的路径顺序搜索所需的动态库文件:
- 如果在生成可执行文件时,用户使用了
-Wl
,-rpath=dir
(其中dir
表示要查找的具体路径,如果查找路径有多个,中间用:
冒号分隔)选项指定动态库的搜索路径,则运行该文件时GCC
会首先到指定的路径中查找所需的库文件; GCC
编译器会前往LD_LIBRARY_PATH
环境变量指明的路径中查找所需的动态库文件;GCC
编译器会前往/ect/ld.so.conf
文件中指定的搜索路径查找动态库文件;GCC
编译器会前往默认的搜索路径中(例如/lib
、/lib64
、/usr/lib
、/usr/lib64
等)中查找所需的动态库文件。
注意,可执行文件的当前存储路径,并不在默认的搜索路径范围内,因此即便将动态库文件和可执行文件放在同一目录下,
GCC
编译器也可能提示“找不到动态库”。
因此,对于 GCC
运行可执行文件时提示找不到动态库文件的问题,常用的解决方法是:
- 将动态库文件的存储路径,添加到
LD_LIBRARY_PATH
环境变量中。假设动态库文件存储在/usr
目录中,通知执行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr
指令,即可实现此目的(此方式仅在当前命令行窗口中有效);
- 修改动态库文件的存储路径,即将其移动至
GCC
编译器默认的搜索路径中; - 修改
~/.bashrc
或~/.bash_profile
文件,即在文件最后一行添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx
(xxx
为动态库文件的绝对存储路径)。保存之后,执行 source bashrc
指令(此方式仅对当前登陆用户有效)。
值得一提的是,GCC
编译器提供有 ldd
指令,借助该指令,我们可以明确知道某个可执行文件需要哪些动态库文件做支撑、这些动态库文件是否已经找到、各个动态库文件的具体存储路径等信息。
以前面示例为例,执行如下 ldd
指令:
wohu@ubuntu:~/cpp/src$ ldd main.exe
linux-vdso.so.1 => (0x00007fff06fb3000)
libmymath.so => /lib64/libmymath.so (0x00007f65b2a62000)
libc.so.6 => /lib64/libc.so.6 (0x00000037e2c00000)
/lib64/ld-linux-x86-64.so.2 (0x00000037e2800000)
注意,如果某个动态库文件未找到,则 =>
后面会显示 not found
,表明 GCC
编译器无法找到该动态库,此时该可执行文件将无法执行。
GCC 链接 xxx:No such file or directory 及运行可执行文件 error while loading shared libraries: xxx.so 解决方案相关推荐
- 解决error while loading shared libraries: xxx.so.x类似问题办法和错误原因
解决error while loading shared libraries: xxx.so.x"类似问题办法和错误原因 编译Tengine时,执行make命令,出现以下错误: erro ...
- 【转】error while loading shared libraries: xxx.so.x 错误的原因和解决办法
原博客地址:http://www.cnblogs.com/Anker/p/3209876.html#undefined error while loading shared libraries: xx ...
- cgo 解决 error while loading shared libraries: xxx.so.x
来自:Dale工作学习笔记 原文:error while loading shared libraries: xxx.so.x" 错误的原因和解决办法 今天在执行一个protobuf程序时, ...
- error while loading shared libraries: xxx.so.x错误的原因和解决办法
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.s ...
- linux下设定动态库路径的命令-error while loading shared libraries: xxx.so.x错误的原因和解决办法
网站:http://blog.chinaunix.net/uid-26212859-id-3256667.html 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: ...
- error while loading shared libraries: xxx.so.x错误
2019独角兽企业重金招聘Python工程师标准>>> 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loa ...
- 【linux排错】error while loading shared libraries: xxx.so.x 错误的原因和解决办法
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: lcw: error while loading shared libraries: libjson.so.0: c ...
- error while loading shared libraries: xxx.so.x 错误的原因和解决办法
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.s ...
- error while loading shared libraries: xxx.so.0:cannot open shared object file: No such file or
原文:http://blog.csdn.net/david_xtd/article/details/7625626/ 链接时可以通过-L和-l来指定自己的库,因此链接可以通过,但是运行时,系统仍无法找 ...
最新文章
- USACO network of school 强连通分量
- TortoiseSVN每个菜单项都表示什么意思
- hdu 6386 Age of Moyu (重边判断)
- 大学每天打游戏,不是混吃等死是什么?
- 照看小猫(nowcoder 217602)
- python读取sqlserver的数据_Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例...
- java 读取 tgz_java – 从Spark中的压缩中读取整个文本文件
- 阅面携手英特尔发布“繁星”系列产品,推动机器视觉迈入AI芯片新纪元
- 二分法其实很简单,为什么老是写不对!!!
- c# 执行js方法
- 美萍美发管理系统服务器名称,美萍美发管理系统2017
- 2019年“深圳杯”数学建模挑战赛B题(1、2问)
- Windows 安装PHP SG11插件
- 狂野飙车4java游戏音乐_狂野飙车8赛车背景音乐名称大全
- Word操作技巧大全1(转)
- 处理机和CPU的区别
- windows连接的蓝牙设备(如小爱同学),无法调节音量
- Outlook使用RTF格式发信出现Winmail.dat附件事宜
- 资深投资人“厂长”沈忱:布局区块链就是在布局新的工业革命
- 源码之 Retrofit