Linux使用笔记:Linux下动态链接库配置

Easwy尝试telent一个远端设备时,遇到下面的提示(ssh也遇到同样的错误):

/usr/local/bin/cli: error while loading shared libraries: libAbc.so: cannot open shared object file: No such file or directory 

在这个设备里,由xinetd来启动in.telnetd,而in.telnetd则调用/usr/local/bin/cli来做为登录程序。看上述提示,应该是in.telnetd在启动/usr/local/bin/cli时找不到动态链接库。

首先用ldd命令查看一下/usr/local/bin/cli所使用的动态链接库:

$ ldd /usr/local/bin/cli
linux-vdso32.so.1 =  (0x00100000)
libAbc.so => /usr/local/lib/libAbc.so (0x0fdfc000)
libreadline.so.5 => /lib/libreadline.so.5 (0x0f376000)
libncurses.so.5 => /lib/libncurses.so.5 (0x0f337000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0x0f24e000)
libm.so.6 => /lib/libm.so.6 (0x0f17a000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0f14a000)
/lib/ld.so.1 (0x48000000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0x0efaa000)> 

从上面的命令输出可以看到,cli程序的确会调用libAbc.so这个库,不过上面的输出中,这个库已经被找到了,它对应着文件/usr/local/lib/libAbc.so。考虑到在shell中已经设置了LD_LIBRARY_PATH环境变量,在此环境变量中增加了/usr/local/lib目录,那么是不是xinetd在启动in.telnetd时没有传递此环境变量呢?

于是修改/etc/xinetd.d/telnet,在里面增加一行:

env = LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib 

再次telnet,还是显示上述错误。似乎是in.telnetd在启动cli时没有传递上述环境变量。

幸好还有一个方法来指定动态链接库的位置。

Easwy在目录/etc/ld.so.conf.d中新增加一个文件cli.conf,内容是:

$  cat cli.conf 
/usr/local/lib 

然后再以root身份执行一下ldconfig命令。现在再telnet或ssh,就不会出现上述错误提示了。

/usr/ldconfig命令会读取命令行参数、/etc/ld.so.conf配置文件以及/lib和/usr/lib目录,为动态链接器ld.sold-linux.so生成所需的链接和缓存信息。也就是说,如果不修改任何配置,只有位于/lib和/usr/lib目录的库才能被动态链接器使用。Easwy上面的修改新增了/usr/local/lib目录,并且使用/sbin/ldconfig命令重新生成了缓存,使动态链接器可以引用上述目录的库。这样就解决了此问题。

因此,在你也遇到类似的错误时,如果有root权限,就可以用这种方法来解决;如果没有root权限,那就只能设置一下LD_LIBRARY_PATH环境变量了。

更多内容,请阅读易水博客上的其它文章。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/dynamic_library_configuration_in_linux/

文章的脚注信息由WordPress的wp-posturl插件自动生成

Windows下cscope -q选项出错的解决

以前曾有网友留言,在windows下使用cscope时,使用-q选项出现如下提示:

D:\Temp> cscope -Rbkq
Input file specified two times.

cscope: cannot create inverted index; ignoring -q option
cscope: removed files ncscope.in.out and ncscope.po.out 

当时Easwy以为是windows版本的cscope不支持-q选项。

不过网友Liang Feng昨天留言说:

Windows版本的cscope是支持-q选项的,出现以上错误是因为没找到合适的sort命令。所以只要cscope进程的工作目录下有GNU版本的sort就可以了。注意是进程的工作目录,不是可执行程序的目录。具体原因看一下cscope的代码片段。

build.c

#ifdef WIN32
snprintf(sortcommand, sizeof(sortcommand), “set LC_ALL=C && sort -T %s %s”, tmpdir, temp1);
#else
snprintf(sortcommand, sizeof(sortcommand), “env LC_ALL=C sort -T %s %s”, tmpdir, temp1);
#endif 

于是重新做了一下试验。在安装了Cygwin后,在cygwin的shell界面中使用cscope,没有出现上面的错误提示。但如果打开windows的命令行窗口cmd.exe,在里面执行cscope,则会出现上面的错误。

在仔细比较了cygwin和cmd.exe的环境后发现,原来是Windows自带的sort.exe搞的鬼。

在cygwin的shell窗口中,PATH环境变量的设置会使其先找到GNU版的sort.exe,所以上述cscope命令执行可以成功。但在cmd.exe窗口中,PATH环境变量会使其先找到windows自带的sort.exe而不是GNU sort.exe,所以会出现上面的错误提示。

知道了问题的原因,解决方法就很简单了,我们可以写一个批处理程序,在此程序中重设PATH环境变量,使cscope使用GNU版的sort.exe。示例程序如下:

D:\Temp> type cs.bat
@echo off
set path=c:\cygwin\bin;
cscope -Rbkq 

在这个批处理里,首先把path环境变量指向c:\cygwin\bin;,我的cscope.exe和GNU版的sort.exe都在此目录中。接下来现执行cscope命令,现在它使用的就是GNU版的sort.exe了。

在此感谢网友Liang Feng,谢谢他的提醒。

更多内容,请阅读易水博客上的其它文章。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/cscope_sort_option_on_windows/

文章的脚注信息由WordPress的wp-posturl插件自动生成

新年快乐!虎年吉祥!!

祝各位朋友在虎年里

  虎虎生威
    虎跃龙腾
      虎啸山林
        如虎添翼

千万不要虎头蛇尾哦~~~

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/happy-new-year-of-tiger/

文章的脚注信息由WordPress的wp-posturl插件自动生成

WP-PostURL 1.1发布:在文章尾部增加版本声明和站点/文章链接

WP-PostURL 1.1其实在一周前就已经上传了,一直没有时间更新博客上描述。今天终于抽时间更新了一下。

这个版本主要更正了1.0里的一个Bug。在WP-PostURL 1.0中,用户自定义的文字只能显示在单篇文章中,不能显示在首页、分类页面、TAG页面或者Feed中。在1.1中,允许用户定义这段文字在哪些页面中显示。

另外1.1中也允许用户同时在文章头部和尾部显示两段不同的文字。这样对用户使用会更灵活一些。

如果以前安装1.0,那么升级到1.1后,原来1.0中的配置仍会保持,也就是说,在首页、分类页面、TAG页面或者Feed中仍不会显示自定义的文字。用户需要自行使能这些功能。

本来想在1.1版本中增加在文章中间显示版权信息的功能,后来没有合上去。主要原因是实现方式不够成熟,在禁用WP-PostURL插件后用户文章中的内容会遗留一些垃圾。不过此功能的需求也不强烈,就先不管了。

如果在使用中遇到什么问题,请及时反馈。

另外,对大家帮助推广WP-PostURL插件表示感谢。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/wp-posturl-release-1-1-is-published/

文章的脚注信息由WordPress的wp-posturl插件自动生成

解决安装Eclim后Vim Taglist插件工作不正常的问题

今天启动vi后,发现Taglist窗口不能正常显示文件中的标签。于是赶紧按照Taglist FAQ中列出的步骤检查了一遍(使用命令:help taglist-faq查看Taglist的FAQ)。

当执行下面的命令时,输出如下:


:echo system(Tlist_Ctags_Cmd . ' --version')
connect: Connection refused 

正常情况下,这条命令应该会输出Taglist插件的版本号,但现在显示的却是connect: Connection refused。于是查看了一下Tlist_Ctags_Cmd变量的值:

:echo Tlist_Ctags_Cmd
"/usr/share/eclipse/eclim" -command taglist -c "/usr/bin/ctags" 

这才想起,Easwy前些天安装了Eclim,用来在vim中使用Eclipse的功能。Eclim的作者对ctags和Taglist进行了加强,并且把Tlist_Ctags_Cmd替换成了他自己的版本。所以如果不启动eclimd的话,就会出现上面的错误。

知道了问题的原因,解决起来就简单了。使用/usr/share/eclipse/eclimd启动了eclimd后,Taglist窗口就能够正常显示了。不过Easwy暂时不想使用eclim提供的Taglist功能,所以在~/.vimrc中增加了下面的配置:

let g:EclimTaglistEnabled=0 

这样设置后,再启动vim,使用又是官方版本的Taglist了。

更多内容,请阅读Easwy的博客上的其它文章。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/vim-taglist-plugin-not-work-after-installing-eclim/

文章的脚注信息由WordPress的wp-posturl插件自动生成

易水论坛开通!

博客总体上来讲是一个信息发布的平台,并不适合讨论及交流。从这方面讲,论坛是非常好的交流、讨论及至分享平台。
为了方便大家更好的交流vi/vim相关的知识,Easwy正式开通易水论坛。

易水论坛目前只设立vi/vim编辑器一个版面,以后根据需要再增删。

目前,论坛还在调整与测试中,不过已经开放了注册。关于论坛建设相关的内容,请发表在站务讨论区。欢迎大家针对论坛的建设提出宝贵的建议。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/easwy-forum-open-to-register/

文章的脚注信息由WordPress的wp-posturl插件自动生成