繁体   English   中英

./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

两种选择:

  1. (静态库)编译时写入,例如:

    gcc -static -I $HOME/local/include -L $HOME/local/lib example.c -lgsl -lgslcblas -lm

并将其运行为:

./a.out
  1. (动态库)编译时写入,例如:

    gcc -I $HOME/local/include -L $HOME/local/lib example.c -lgsl -lgslcblas -lm

并执行它:

export LD_LIBRARY_PATH=$HOME/local/lib

./a.out

阅读: https : //www.gnu.org/software/gsl/doc/html/usage.html#shared-libraries

通常,您需要通过键入以下内容来构建 GNU 软件:

./configure [可选的必要 cmd 行参数]

制作

检查

进行安装

您已经完成了前两行,所以只需进行检查和安装 - 然后 ./a.out 应该运行。

另见: http : //www.cnblogs.com/emanlee/p/3318337.html

我的问题可能有点晚了,但我希望这个答案可以帮助遇到同样问题的其他人。

那可能是因为您的 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 等选项用于让编译器知道它必须将输出链接到哪些库。 路径必须在 .bashrc 中的事实来自于动态使用库的事实,因此在运行时它必须能够找到该路径,这要归功于 bashrc wh。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM