当前位置:  开发笔记 > 编程语言 > 正文

Bash脚本用于创建指向共享库的符号链接

如何解决《Bash脚本用于创建指向共享库的符号链接》经验,为你挑选了2个好方法。

我认为这个问题对于shell脚本怪物来说相当容易.

我正在寻找通过bash shell脚本创建Unix共享库的符号链接的最优雅和最短的方法.

我需要的是从一个共享库文件列表开始,如"libmythings.so.1.1,libotherthings.so.5.11",获取创建的符号链接,如:

libmythings.so -> libmythings.so.1 -> libmythings.so.1.1
libotherthings.so -> libotherthings.so.5 -> libotherthings.so.5.11

库文件位于包含其他文件(如其他shell脚本)的目录中.

编辑:嗯,"ldconfig -nN." 可以正常工作,但是我还需要在".so"后面没有附加主要编号的链接,至少有一个库,因为一个或多个库是来自Java的JNI调用的入口点,所以当一个库通过System.loadlibrary("libraryname")实例化它需要一个名为"libraryname.so"的库,而不是"libraryname.so.X".

如果有一个Java部件的解决方法,只有ldconfig -nN的解决方案可以工作.



1> Kent Fredric..:

我相信ldconfig是这样做的标准工具.

我记得它可以根据内部版本信息生成符号链接,但现在无法找到源代码.

编辑是的,如果你跑

ldconfig -v 

您将看到它基于库内部生成所有链接.

ldconfig /path/to/dir 

只会为该目录中的文件创建链接

但是请注意,我玩它并且它似乎不能始终创建.so $,只是.so.{major}

我不确定它的内部是如何工作的,但我知道:

lib # rm libmagic.so
lib # rm libmagic.so.1
lib # ldconfig 
lib # file libmagic.so.1   
libmagic.so.1: symbolic link to `libmagic.so.1.0.0'
lib # file libmagic.so 
libmagic.so: cannot open `libmagic.so' (No such file or directory)

因此,决定其运作方式对我来说是一个谜

在进一步消除时编辑,.la文件对行为没有影响.

"SO"名称字段表示将调用符号链接的内容.

而且只会有一个.

0x000000000000000e(SONAME)库soname:[libmagix.so]

这是在破解代码并用空格替换".1"之后.

ldconfig生成"libmagic.so"(是的,包含空格)


"ldconfig -nN." 只适用于当前目录,但它只创建了库的主要版本(libmylib.1 - > libmylib.1.10).

2> Jonathan Lef..:
for baselib in "$@"
do
     shortlib=$baselib
     while extn=$(echo $shortlib | sed 's/\.[0-9][0-9]*$//')
           [ -n "$extn" ]
     do
         shortlib=$(basename $shortlib $extn)
         ln -s $baselib $shortlib
     done
done

我被骗了 - 所有的链接都去了基础库(libmythings.so.1.1); 如果你真的想要连锁,那么你需要:

for baselib in "$@"
do
     shortlib=$baselib
     while extn=$(echo $shortlib | sed 's/\.[0-9][0-9]*$//')
           [ -n "$extn" ]
     do
         shorterlib=$(basename $shortlib $extn)
         ln -s $shortlib $shorterlib
         shortlib=$shorterlib
     done
done           

当心 - 未经测试的代码.


傲慢在克星之前.

评论到达,上面的代码不起作用 - 评论是正确的.具有原位测试的固定版本是:

set -- libname.so.5.1.1

for baselib in "$@"
do
    shortlib=$baselib
    while extn=$(echo $shortlib | sed -n '/\.[0-9][0-9]*$/s/.*\(\.[0-9][0-9]*\)$/\1/p')
          [ -n "$extn" ]
    do
        shortlib=$(basename $shortlib $extn)
        echo ln -s $baselib $shortlib
    done
done

更改在sed命令中.此版本默认情况下不打印任何内容(-n),仅匹配以点后跟数字结尾的行,然后删除除该后缀之外的所有内容,并打印剩余的赋值给extn.修改后,脚本会生成以下输出.删除echo以使其执行链接命令.

ln -s libname.so.5.1.1 libname.so.5.1
ln -s libname.so.5.1.1 libname.so.5
ln -s libname.so.5.1.1 libname.so

该脚本说明了关于shell脚本的一个有趣且经常被忽略的观点:一段时间的条件块中的操作序列不必是单个命令.具有编辑操作的行的状态不会影响整个测试是否成功; 最后一个命令的退出状态' [ -n "$extn" ]'控制循环是否继续.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有