100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > GCC 链接 xxx:No such file or directory 及运行可执行文件 error while l

GCC 链接 xxx:No such file or directory 及运行可执行文件 error while l

时间:2020-03-21 14:57:50

相关推荐

GCC 链接 xxx:No such file or directory 及运行可执行文件 error while l

关于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.exewohu@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.exelinux-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 解决方案

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。