我交叉编译程序时,这样进行:
export LDFLAGS="-Wl,--rpath-link -Wl,/work/crossbuild"
./configure --host=arm-linux --prefix=/work/crossbuild
make
make install
然后把编译得到的可执行程序放到单板/usr/bin目录下,
把/work/crossbuild中的库放到单板/usr/lib目录下。
程序可以正常启动,但是使用strace查看发现它首先会去/work/crossbuild/lib
查找库文件,我想禁止它查找这个目录。
在编译时,看到很多"-rpath /work/crossbuild/lib"为信息,这表明把
/work/crossbuild/lib目录名编进程序中去了,手工去除-rpath实在艰难,
不知道有什么好方法?
试一下在板上显式地设置LD_LIBRARY_PATH,在/etc/init.d/rcS中加入:
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib
再strace
运行时库的查找路径及优先顺序如下:
① 编译程序时使用“-rpath”指定的目录;
② 环境变量LD_LIBRARY_PATH指定的目录(它可以指定多个目录,以冒号分隔);
③ 文件/etc/ld.so.cache中指定的目录,这个文件是ldconfig程序读取/etc/ld.so.conf文件生成的;
④ 默认路径:/lib、/usr/lib。
可以使用chrpath工具修改编译好的程序的-rpath目录;
更好的方法是使用scratchbox等工具进行编译,
它就相当于在目本板上编译程序,
直接安装在/usr、/usr/lib等目录(这些目录不是主机的/usr、/usr/lib目录)下。
阅读(1686) | 评论(0) | 转发(0) |