今天在gentoo系统上安装nixnote(A.K.A nevernote, evernote的一个开源实现)出现下面这个错误。
安装完成后点击gnome下的相应图标,发现启动不成功,nixnote自动退出。

看看nixnote.desktop文件有没有写错。

$ cat /usr/share/applications/nixnote.desktop

[Desktop Entry]

Name=NixNote
Comment=Use with Evernote to remember everything
GenericName=Evernote-clone
Exec=/usr/share/nixnote/nixnote.sh
Icon=/usr/share/nixnote/nixnote.png
StartupNotify=true
Terminal=false
Type=Application
Categories=Network;

程序路径和参数都对着呢,于是想着在终端下运行nixnote看看它的错误输出
$ /usr/share/nixnote/nixnote.sh
...(省略部分信息)
Caused by: java.lang.UnsatisfiedLinkError: /tmp/QtJambi_arnk_i386_4.5.2_01_gcc-20090628-0950/lib/libQtGui.so.4: libpng12.so.0: cannot open shared object file: No such file or directory
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
    at java.lang.Runtime.load0(Runtime.java:787)
    at java.lang.Runtime.load(Runtime.java:775)
    at com.trolltech.qt.internal.NativeLibraryManager.loadLibrary_helper(NativeLibraryManager.java:458)
    at com.trolltech.qt.internal.NativeLibraryManager.loadNativeLibrary(NativeLibraryManager.java:426)
    ... 5 more
Could not find the main class: cx.fbn.nevernote.NeverNote. Program will exit.

说的很清楚,无法加载libpng12.so.0这个动态链接库。
so,看看系统里有没有:
$ locate libpng12.so.0
/home/arnk/.dropbox-dist/libpng12.so.0

系统里有,但是没有加载上这个libpng12.so.0
于是想着把它加到LD_LIBRARY_PATH这个环境变量里去。
问题来了,我应该在哪里声明LD_LIBRARY_PATH这个环境变量?
我尝试把它声明在~/.bashrc里面去了
export LD_LIBRARY_PATH=$HOME/.dropbox-list:${LD_LIBRARY_PATH}
这样导致的结果是在终端下可以正常启动nixnote,但是点击gnome下的相应图标还是无法正常启动。
什么原因导致点击gnome下的相应图标无法正常启动呢?同上,尝试把错误输出重定向到一个log文件。
查看下启动的脚本文件:
$ cat /usr/share/nixnote/nixnote.sh
...(省略部分信息)
java -Xmx$NN_XMX -Xms$NN_XMS -XX:NewRatio=$NN_NEW_RATIO $NN_GC_OPT $NN_DEBUG -classpath $NN_CLASSPATH cx.fbn.nevernote.NeverNote --name=$NN_NAME  > /tmp/nixnote.log 2>&1
在原始文件中添加红色部分的代码,尝试将标准输出、标准错误重定向到/tmp/nixnote.log。看看到底是什么原来导致点击图标无法启动。
发现依然是libpng12.so.0: cannot open shared object file: No such file or directory这个错误,说明~./bashrc下声明的LD_LIBRARY_PATH环境变量,根本没有影响到gnome下的相应程序。于是搜索设定LD_LIBRARY_PATH环境变量的文章,很乱,而且有本书说使用LD_LIBRARY_PATH并不好http://www.tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
很长一段时间都是在折腾在那里声明LD_LIBRARY_PATH这个环境变量使其能够影响到gnome的地方。
尝试在/etc/profile.d目录下面新建dropbox.sh脚本来声明LD_LIBRARY_PATH环境变量。结果reboot后发现系统无法登录。
只能找个linux光盘chroot进去将/etc/profile.d/dropbox.sh文件删除。
这说明LD_LIBRARY_PATH已经影响到gnome,但是系统中的其他程序可能依赖其它版本的libpng动态链接库。
于是在系统里搜索看看
$ locate libpng | grep -E "libpng.*\.so.*"
/home/arnk/.dropbox-dist/libpng12.so.0
/usr/lib/libpng.so
/usr/lib/libpng14.so
/usr/lib/libpng14.so.14
/usr/lib/libpng14.so.14.8.0
看看默认的libpng.so到底链接到哪里。
$ ls -l /usr/lib/libpng.so
lrwxrwxrwx 1 root root 11  9月  6 16:48 /usr/lib/libpng.so -> libpng14.so

$ ls -l /usr/lib/libpng14.so
lrwxrwxrwx 1 root root 18  9月  6 16:48 /usr/lib/libpng14.so -> libpng14.so.14.8.0
原来系统里默认使用的是这个/usr/lib/libpng14.so.14.8.0动态链接库。

loader加载动态链接库时/usr/lib默认肯定是能搜索到的,何不在/usr/lib下加一个软链接试试。
sudo ln -sv /home/arnk/.dropbox-dist/libpng12.so.0 /usr/lib/libpng12.so.0

OK,问题解决了。将自己在~/.bashrc文件中添加的LD_LIBRARY_PATH删除。
突然意识到自己绕了很大一个弯,绕到LD_LIBRARY_PATH这个问题上去了,ANYWAY这种学费总是要交的。
参考:
1. http://www.linuxquestions.org/questions/linux-software-2/how-to-set-ld_library_path-684799/
2. http://www.tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
3. http://b.nowind.tk/2010/12/3/linuxld.html
4. http://blog.csdn.net/brucejia/article/details/6439531
5. http://www.linuxidc.com/Linux/2011-02/31915p2.htm
6. http://sourceforge.net/apps/phpbb/nevernote/viewtopic.php?f=3&t=167
posted on 2011-09-07 16:34  Arnk Liu  阅读(930)  评论(0编辑  收藏  举报