日期:2014-05-16  浏览次数:20766 次

#LINUX#通过编译链接,却运行时找不到.so文件

我们知道在linux下,.so文件相当与windows上的dll文件,即动态链接库。

动态链接库是为了减少发布程序的大小,可以将具有相同功能的code放在动态链接库中,随应用程序一起发布。而对于应用程序来说,只需要知道其接口就可以,在运行时动态的加载代码到内存中,与其相反的是静态链接库。

在接手一个项目的代码后,因为此代码需要很多第三方库,所以,在本机安装这些第三方库之后,我也成功的通过了编译与链接阶段,生成了可以执行的代码。

可是在运行的时候,出现了以下的错误提示:

baiyang@baiyang-Lenovo-G450:~/Desktop$ ./test_cal_features
./test_cal_features: error while loading shared libraries: libCGAL.so.5: cannot open shared object file: No such file or directory

这里涉及几个问题:
1.为何能通过编译与链接,却不能运行?
2.我明明将libCGAL.so.5,安装到了/usr/local/lib下啊,既然能通过编译与链接,应该能找到啊?
3.执行./test_cal_features时,到底发生了什么事?
4.linux下,应用程序如何对.so进行搜索?

但本质问题,就是linux下gcc搜索路径设置问题.

好,今天就一一来回答以上到问题。

开始一个新的例子

plus.c 文件

view plaincopy to clipboardprint?
  1. int?plus(int?a,?int?b)??
  2. {??
  3. ????return?a?+?b;??
  4. }??

编译成动态链接库

gcc plus.c -o libfoo.so -shared -fPIC

产生动态链接库libfoo.so
另外写一个main.c文件