关于找不到gsl共享库的问题

来源:互联网 发布:羽毛球编排软件 编辑:程序博客网 时间:2024/05/22 09:04

       某日,本人要进行一些随机数方面的计算,所以就装了GSL,也就是大名鼎鼎的GNU Scientific Library,操作系统是ubuntu 14.04。安装GSL的时候非常顺利,无非是GNU软件的那一套,不放心的话,不妨读一下GSL自带的README。编译程序时,我把“-lgsl -lgslcblas”写到makefile里面。本以为就是这么简单,没想到还是遇到了一点问题。听我细细道来吧。。。

       make的时候也没啥问题,可是当我执行生成的文件时,问题出现了,系统提示“error while loading shared libraries: libgsl.so.0: cannot open shared object file: No such file or directory”。通常,出现这种问题可能是因为GSL安装目录没有在系统的默认共享库目录中。一般情况下,linux的默认共享库目录是/lib和/usr/lib。不幸的是,GSL的共享库文件默认安装在/usr/local/lib中(白纸黑字写在GSL给出的INSTALL文件中,所以请你认真读说明文档),所以,gcc无法找到libgsl.so.0。系统怎样才能找到/usr/local/lib中的共享库文件呢?

       LD_LIBRARY_PATH是linux的一个环境变量,主要用于系统查找除默认共享库目录以外的其他共享库目录。编辑这个变量很简单,直接在终端里面分别输入以下命令即可:

$LD_LIBRARY_PATH=/usr/local/lib$export LD_LIBRARY_PATH
       你也可以从https://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html找到类似的方法。本来以为这就大功告成了,不料编译执行时,刚才那个错误又出现了。奇怪吧,都已经添加共享库目录了,为啥系统还是找不到?

       要解决这个问题,得知道linux是怎样使用共享库的。有一篇文章非常好http://www.dwheeler.com/program-library/Program-Library-HOWTO/x36.html,感兴趣的读者自己看。我在这里简单解释一下。

       在linux中,当我们运行一个可执行文件的时候,操作系统首先加载并运行程序加载器/lib/ld-linux.so.X(X是版本号)。然后,程序加载器再去查找和加载这个可执行文件调用的其他共享库。除了系统默认的共享库目录,程序用到的其他共享库目录都放在/etc/ld.so.conf中,因此系统可以逐个搜索这些目录并逐一加载用到的共享库。但是,在程序启动时搜索共享库目录是非常低效的做法,高效的做法是把这些共享库目录放在缓存中。这时就用到了ldconfig,它可以把共享库目录写入缓存文件/etc/ld.so.cache中,这样每启动一个程序,系统直接从缓存文件读入共享库目录即可。这个方法缩短了查找共享库所需的时间。所以,添加或删除一个共享库后,我们应该手动调用ldconfig更新缓存文件/etc/ld.so.cache。事实上,如果你通过包管理器添加或者删除共享库,包管理器会自动帮你调用ldconfig以更新缓存。

      说到这里,问题基本上就解决了。安装GSL,修改LD_LIBRARY_PATH,再执行ldconfig命令即可,程序运行成功!


0 0