./a.out:加载共享库时出错:libgsl.so.23:无法打开共享对象文件:没有这样的文件或目录
./a.out: error while loading shared libraries: libgsl.so.23: cannot open shared object file: No such file or directory
从源代码安装 GNU 科学库 (GSL) 后,我编写了一个程序来测试该库是否工作。
$gcc -Wall -I ~/gsl/include -c example.c
$gcc -L ~/gsl/lib example.o -lgsl -lgslcblas -lm
$./a.out
./a.out: error while loading shared libraries: libgsl.so.23: cannot open shared object file: No such file or directory
编译链接过程没有问题。 No such file or directory
但是有这样的目录
$ls -l ~/gsl/lib
total 32920
-rw-r--r-- 1 wm wm 19418210 8月 14 07:09 libgsl.a
-rw-r--r-- 1 wm wm 1840642 8月 14 07:08 libgslcblas.a
-rwxr-xr-x 1 wm wm 951 8月 14 07:08 libgslcblas.la
lrwxrwxrwx 1 wm wm 20 8月 14 07:08 libgslcblas.so -> libgslcblas.so.0.0.0
lrwxrwxrwx 1 wm wm 20 8月 14 07:08 libgslcblas.so.0 -> libgslcblas.so.0.0.0
-rwxr-xr-x 1 wm wm 1100520 8月 14 07:08 libgslcblas.so.0.0.0
-rwxr-xr-x 1 wm wm 920 8月 14 07:09 libgsl.la
lrwxrwxrwx 1 wm wm 16 8月 14 07:09 libgsl.so -> libgsl.so.23.0.0
lrwxrwxrwx 1 wm wm 16 8月 14 07:09 libgsl.so.23 -> libgsl.so.23.0.0
-rwxr-xr-x 1 wm wm 11333224 8月 14 07:09 libgsl.so.23.0.0
drwxrwxr-x 2 wm wm 4096 8月 14 07:09 pkgconfig
阅读:https://www.gnu.org/software/gsl/doc/html/usage.html#shared-libraries
通常您需要通过键入以下内容来构建 GNU 软件:
./configure [可选必要的 cmd 行参数]
制作
检查
进行安装
您已经完成了前两行,所以只需检查并安装 - 然后 ./a.out 应该 运行.
两个选项:
(静态库)编译时写入,例如:
gcc -static -I $HOME/local/include -L $HOME/local/lib example.c -lgsl -lgslcblas -lm
和运行它是:
./a.out
(动态库)编译时写入,例如:
gcc -I $HOME/local/include -L $HOME/local/lib example.c -lgsl -lgslcblas -lm
并执行它:
export LD_LIBRARY_PATH=$HOME/local/lib
./a.out
我的问题可能有点晚了,但我希望这个答案可以帮助其他遇到同样问题的人。
那可能是因为你的 gcc 不知道共享库在哪里。
实际上,您必须明确告诉您的编译器您的程序使用的共享库的位置。
解决方案是:
方案A(暂定):
在bash,你需要
export LD_LIBRARY_PATH=/usr/local/lib
假设您的 gsl 安装在默认目录中。
B计划(永久):
编辑 /etc/ld.so.conf
(你需要 sudo
这个)。将您的位置放在文件末尾:
sudoedit /etc/ld.so.conf
在 vim 中键入 o
,然后键入 /usr/local/lib。然后键入 esc
并键入 :wq
.
现在重新编译你的文件,它就可以工作了。
如果没有,您可以 运行 ldd a.out
查看库是否已链接。
我知道有点晚了,但我想补充一下答案。首先,按照 https://coral.ise.lehigh.edu/jild13/2016/07/11/hello/ 中的步骤确保您所做的本地安装是正确的。然后,您可以按如下方式在一行中编译所有内容:
gcc -Wall -I/path_to_include/ -L/path_to_lib/ program_name.c -o output_name.out -lgsl -lgslcblas -lm
此外,为了使其正常工作,您需要在 ~/.bashrc 中包含库路径,如下所示:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path_to_lib/"
所以,稍微解释一下:-Wall 是众所周知的警告。 -I 导致 .h 文件,其中定义了所需的函数和变量,而 -L 选项是为了让编译器能够知道共享库在哪里。最后,-lm 等选项是为了让编译器知道它必须 link 输出到哪些库。路径必须在 .bashrc 中的事实来自库是动态使用的事实,因此在 运行 时间它必须能够找到该路径,该路径是通过 bashrc wh 加载的。
从源代码安装 GNU 科学库 (GSL) 后,我编写了一个程序来测试该库是否工作。
$gcc -Wall -I ~/gsl/include -c example.c
$gcc -L ~/gsl/lib example.o -lgsl -lgslcblas -lm
$./a.out
./a.out: error while loading shared libraries: libgsl.so.23: cannot open shared object file: No such file or directory
编译链接过程没有问题。 No such file or directory
但是有这样的目录
$ls -l ~/gsl/lib
total 32920
-rw-r--r-- 1 wm wm 19418210 8月 14 07:09 libgsl.a
-rw-r--r-- 1 wm wm 1840642 8月 14 07:08 libgslcblas.a
-rwxr-xr-x 1 wm wm 951 8月 14 07:08 libgslcblas.la
lrwxrwxrwx 1 wm wm 20 8月 14 07:08 libgslcblas.so -> libgslcblas.so.0.0.0
lrwxrwxrwx 1 wm wm 20 8月 14 07:08 libgslcblas.so.0 -> libgslcblas.so.0.0.0
-rwxr-xr-x 1 wm wm 1100520 8月 14 07:08 libgslcblas.so.0.0.0
-rwxr-xr-x 1 wm wm 920 8月 14 07:09 libgsl.la
lrwxrwxrwx 1 wm wm 16 8月 14 07:09 libgsl.so -> libgsl.so.23.0.0
lrwxrwxrwx 1 wm wm 16 8月 14 07:09 libgsl.so.23 -> libgsl.so.23.0.0
-rwxr-xr-x 1 wm wm 11333224 8月 14 07:09 libgsl.so.23.0.0
drwxrwxr-x 2 wm wm 4096 8月 14 07:09 pkgconfig
阅读:https://www.gnu.org/software/gsl/doc/html/usage.html#shared-libraries
通常您需要通过键入以下内容来构建 GNU 软件:
./configure [可选必要的 cmd 行参数]
制作
检查
进行安装
您已经完成了前两行,所以只需检查并安装 - 然后 ./a.out 应该 运行.
两个选项:
(静态库)编译时写入,例如:
gcc -static -I $HOME/local/include -L $HOME/local/lib example.c -lgsl -lgslcblas -lm
和运行它是:
./a.out
(动态库)编译时写入,例如:
gcc -I $HOME/local/include -L $HOME/local/lib example.c -lgsl -lgslcblas -lm
并执行它:
export LD_LIBRARY_PATH=$HOME/local/lib
./a.out
我的问题可能有点晚了,但我希望这个答案可以帮助其他遇到同样问题的人。
那可能是因为你的 gcc 不知道共享库在哪里。 实际上,您必须明确告诉您的编译器您的程序使用的共享库的位置。 解决方案是: 方案A(暂定): 在bash,你需要
export LD_LIBRARY_PATH=/usr/local/lib
假设您的 gsl 安装在默认目录中。
B计划(永久):
编辑 /etc/ld.so.conf
(你需要 sudo
这个)。将您的位置放在文件末尾:
sudoedit /etc/ld.so.conf
在 vim 中键入 o
,然后键入 /usr/local/lib。然后键入 esc
并键入 :wq
.
现在重新编译你的文件,它就可以工作了。
如果没有,您可以 运行 ldd a.out
查看库是否已链接。
我知道有点晚了,但我想补充一下答案。首先,按照 https://coral.ise.lehigh.edu/jild13/2016/07/11/hello/ 中的步骤确保您所做的本地安装是正确的。然后,您可以按如下方式在一行中编译所有内容:
gcc -Wall -I/path_to_include/ -L/path_to_lib/ program_name.c -o output_name.out -lgsl -lgslcblas -lm
此外,为了使其正常工作,您需要在 ~/.bashrc 中包含库路径,如下所示:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path_to_lib/"
所以,稍微解释一下:-Wall 是众所周知的警告。 -I 导致 .h 文件,其中定义了所需的函数和变量,而 -L 选项是为了让编译器能够知道共享库在哪里。最后,-lm 等选项是为了让编译器知道它必须 link 输出到哪些库。路径必须在 .bashrc 中的事实来自库是动态使用的事实,因此在 运行 时间它必须能够找到该路径,该路径是通过 bashrc wh 加载的。