這篇文章是除錯紀錄與寫給 Power User/Geek 參考服用,一般使用者請等 googleearth-package (Ubuntu) 正式版修正。
今天用 Holux M-241 紀錄了一段騎自行車的路程,本想取出 KML 來丟進 Google Earth 看一下到底繞了多遠。結果久久沒用的 Google Earth 一開即當,看了看還在 4.2 版。於是決定升級一下,發現 Google Earth for Linux 的支援相當糟糕。
在 Debian/Ubuntu 上,你可使用 googleearth-package 這個工具,來幫你把 googleearth 包裝成 deb 格式。於是你可以用 dpkg 來安裝、管理。相較於 Google Earth 原本提供的安裝方式,這樣顯然乾淨多了。不過試了幾次,發現 Google Earth 啟動後瞬間就會當掉,並存了一份 Crashlog 在 ${HOME}/.googleearth/crashlogs/。
於是開始了除錯旅程。我的環境是 Debian Sid.
Google 官方版本
決定手動下載安裝看看,很悲慘的是一執行 GoogleEarthLinux.bin 就出現以下錯誤
Verifying archive integrity... All good. Uncompressing Google Earth for GNU/Linux 5.2.1.1588.............................................................. setup.data/setup.xml:1: parser error : Document is empty ^ setup.data/setup.xml:1: parser error : Start tag expected, '<' not found ^ Couldn't load 'setup.data/setup.xml'
你必須這樣做之後才能正確啟動安裝程式
$ sh GoogleEarthLinux.bin --target /tmp/ge $ cd /tmp/ge $ mv -fv setup.data/bin/Linux/x86/setup.gtk /tmp/ge/setup.data/bin/Linux/x86/setup.gtk2 $ ./setup.sh
安裝完畢之後,你會發現啟動 Google Earth 時,閃過幾個畫面,console 訊息會告訴你 Google Earth has caught signal 11
.
你可以在 ${HOME}/.googleearth/crashlogs/ 找到當機的軟體日誌。你可能會看到以下訊息
Stacktrace from glibc: ./libgoogleearth_free.so(+0xd090b)[0xb773090b] [0xb7789400] /usr/lib/libgdk_pixbuf-2.0.so.0(gdk_pixbuf_from_pixdata+0x13f)[0x94979daf] /usr/lib/libgdk_pixbuf-2.0.so.0(gdk_pixbuf_new_from_inline+0x63)[0x9497a073] /usr/lib/flashplugin-nonfree/libflashplayer.so(+0x4d335)[0x94f7d335] /usr/lib/flashplugin-nonfree/libflashplayer.so(+0x4bd8e)[0x94f7bd8e] /usr/lib/flashplugin-nonfree/libflashplayer.so(NP_Initialize+0x1ae)[0x94f8028e] ./libQtWebKit.so.4(+0x747b22)[0xb62edb22] ./libQtWebKit.so.4(+0x747c0c)[0xb62edc0c] ./libQtWebKit.so.4(+0x6062ff)[0xb61ac2ff] ./libQtWebKit.so.4(+0x604516)[0xb61aa516] ./libQtWebKit.so.4(+0x60476a)[0xb61aa76a] ./libQtWebKit.so.4(+0x712beb)[0xb62b8beb]
這是 Google Earth 內建的 QtWebKit libraries 試著要載入 browser plugins,由於相容問題當掉了。有鑑於 Google Earth 內附得 Qt libraries 還造成其他的問題,像是中文選單變成方格等等。我們可以砍掉 Google 附贈的 Qt4,直接用系統內建的 Qt4 函式庫即可。
cd google-earth for qtlib in libQtCore.so.4 libQtGui.so.4 libQtNetwork.so.4 libQtWebKit.so.4 ; do mv ${qtlib} ${qtlib}.moved.for.workaround done
另外一個問題是 libIGGfx.so,它顯然用 (linked) 了 libfreeimage3,但是實際跑起來卻會造成問題。
Stacktrace from glibc: /usr/lib/googleearth/libgoogleearth_free.so(+0xd090b)[0xb788290b] [0xb78db400] /usr/lib/googleearth/libIGGfx.so(+0x1296c9)[0xb3f206c9] /usr/lib/googleearth/libIGGfx.so(FreeImage_LoadFromHandle+0xb1)[0xb3f0e2c1] /usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx7igImage21platformLoadFreeImageEPNS_4Core6igFileEbPNS0_19igImageMetaDataListE+0xa1)[0xb3ef84b1] /usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx10igOglImage12platformLoadEPNS_4Core6igFileEPNS0_19igImageMetaDataListE+0x112)[0xb3ef8bb2] /usr/lib/googleearth/libIGGfx.so(_ZN3Gap3Gfx7igImage8loadFileEPNS_4Core6igFileEPNS0_19igImageMetaDataListE+0x12d)[0xb3ee91ad] /usr/lib/googleearth/libevll.so(_ZN5earth4evll7Texture9LoadBytesEPKhi+0xa6d)[0xb0ad7b8d] /usr/lib/googleearth/libevll.so(_ZN5earth4evll7Texture12ProcessWorkQEd+0x184)[0xb0ae3594]
解決方法是自己裝 libfreeimage3,然後用 LD_PRELOAD 換掉 Google Earth 包在 libIGGfx.so 中的函式。如下
LD_PRELOAD=/usr/lib/libfreeimage.so.3 googleearth
這樣你應該可以順利的啟動 Google Earth 5.2 了。
Debian/Ubuntu 版本
在 Debian 與 Ubuntu 上,Adnan Hodzic已經包裝了 googleearth-package,Debian 跟 Ubuntu 使用者只需要下達 make-googleearth-package 指令,系統就會自動下載 Google Earth,並包裝成 deb 檔案。再用 dpkg -i googleearth_*.deb 安裝即可。
目前的版本 (0.5.7) 還是用 Google Earth 預設的 Qt4 與 libfreeimage3。我提了一版修正,希望新版中可以預設刪除 Qt4 與 libfreeimage3,修正檔可於 #596423 取得。