我从别人的项目中找到了以下脚本。
有人可以解释下面的脚本做什么吗?
for libtocopy in $LIBS_TO_COPY ; do
libfile=`ldd bin/foo.so | grep lib${libtocopy} | cut -d' ' -f 3`
if [ "x$libfile" != "x" ] ; then
#echo "$libtocopy : copying $libfile in libs"
cp $libfile foo/libs
fi
done
答案 0 :(得分:1)
简而言之,脚本将从脚本中提到的bin/foo.so
二进制文件中提取动态选择的共享库。
驱动整个脚本的命令是ldd。这将解决并打印可执行文件的任何动态依赖关系。
例如这是一个示例输出(在方便的Raspberry Pi上,但是输出兼容):
ldd /bin/grep
linux-vdso.so.1 (0x7ef36000)
/usr/lib/arm-linux-gnueabihf/libarmmem.so (0x76f8b000)
libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0x76efe000)
libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0x76eeb000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76dac000)
/lib/ld-linux-armhf.so.3 (0x76fa1000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x76d83000)
因此,对于LIBS_TO_COPY变量中的每个名称(例如,上面最后一行的pthread
),它将找到带有lib
前缀的行(例如libpthread
)。
每条匹配的行都通过管道传输到cut
中,echo
将选择该行的第三个字段(使用空格作为分隔符),即该库的解析路径。
然后将这些已解决的依赖项复制到所选目录中。
例如,将脚本中的bin/foo.so
取消注释,并将/bin/grep
切换为$ export LIBS_TO_COPY='pthread c dl'
$ bash libextract.bash
pthread : copying /lib/arm-linux-gnueabihf/libpthread.so.0 in libs
c : copying /lib/arm-linux-gnueabihf/libc.so.6 in libs
dl : copying /lib/arm-linux-gnueabihf/libdl.so.2 in libs
:
bash
(sh
和 /* The method takes in a page index and creates the next content view controller. If the controller can
be created, we call the built-in setViewControllers method and navigate to the next view controller.*/
func forward(index: Int) {
if let nextViewController = contentViewController(at: index + 1) {
setViewControllers([nextViewController], direction: .forward, animated: true, completion: nil)
}
}
两个shell给出相同的输出)。