David.Ko

Follow my heart!
posts - 100, comments - 11, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

转载于:http://hi.baidu.com/li_dayao/blog/item/ad6cddcb9d25641bbf09e66b.html 

 在arm-linux环境下运行可执行程序mocp,在加载动态库libdecoder.so时,却总是报错:File not found。在代码中添加很多printf,找到是在dlopen时报错。最初以为,是函数dlopen找不到lib_decoder.so文件。那么就认为有以下几种可能:

1,动态库给的搜索路径不对;

2,编译生成动态库的编译工具和程序的运行环境不同;

3,交叉编译环境不能识别dlopen(当然这个可能性是瞎猜的)。

  于是写了个测试程序并交叉编译,自己创建一个动态库libabc.so,并用dlopen加载它。

1,更改动态库的存放路径,结果是在任何路径下都可以找到;

2,用这个正确的测试程序加载libdecoder.so,结果是不管什么路径,就是找不到;

3,在mocp运行时加载libabd.so,能找到;

结论:只要给了dlopen函数一个路径,它就能到这个路径下去寻找指定的库;都是用arm-linux-uclibc-编译的,编译环境相同。那么就是libdecoder.so这个库本身的问题。

  于是将命令从Makefile中抽出来,在shell中单独运行命令生成这个库,结果还是找不到。然后把命令简化,去掉各种选项,比如链接选项,仅仅用

arm-linux-uclibc-gcc -fpic -shared snow.c rain.c -o libdecoder.so

生成库后,测试发现能找到了。添加一个链接选项-ldl,又找不到了。

  这才想到,libdecoder.so还要加载一个动态库libdl.sofile not found是不是指的是这个库找不到啊?查找运行环境下的/lib发现,果然没有libdl.so文件。把这个库拷进来,mocpdlopen的时候就通过了。Done

  其实,如果我在运行程序之前就检查好这个程序究竟需要那些动态库,也就不至于花了这么大力气查找这个问题。

  用objdump命令就可以查看目标文件包含的信息,其中就有程序需要链接的动态库。


只有注册用户登录后才能发表评论。


网站导航: