2010年1月2日 星期六

解決 /usr/bin/ld: cannot find -lxxx 問題

問題:
在linux環境編譯應用程式或lib的source code時常常會出現如下的錯誤訊息:
  • /usr/bin/ld: cannot find -lxxx

這些訊息會隨著編譯不同類型的source code 而有不同的結果出來如:
  • /usr/bin/ld: cannot find -lc
  • /usr/bin/ld: cannot find -lltdl
  • /usr/bin/ld: cannot find -lXtst

其中xxx即表示函式庫文件名稱,如上例的:libc.so、libltdl.so、libXtst.so。
其命名規則是:lib+庫名(即xxx)+.so。


會發生這樣的原因有以下三種情形:
1 系統沒有安裝相對應的lib
2 相對應的lib版本不對
3 lib(.so檔)的symbolic link 不正確,沒有連結到正確的函式庫文件(.so)

對於上述三種原因有一篇文章寫的很棒可參考這一篇文章的第4點:
gcc命令祥解


解決方法:
(1)先判斷在/usr/lib 下的相對應的函式庫文件(.so) 的 symbolic link 是否正確
若不正確改成正確的連結目標即可解決問題。

(2)若不是 symbolic link 的問題引起,而是系統缺少相對應的lib安裝lib即可解決。

(3)如何安裝缺少的lib:
以上面三個錯誤訊息為例:
錯誤1缺少libc的LIB
錯誤2缺少libltdl的LIB
錯誤3缺少libXtst的LIB
 

  以Ubuntu為例:
  先搜尋相對應的LIB再進行安裝的作業如:
  apt-cache search libc-dev
apt-cache search libltdl-dev
apt-cache search libXtst-dev

實例:
在進行輸入法gcin的 Source Code的編譯時出現以下的錯誤訊息:
/usr/bin/ld: cannot find -lXtst

經檢查後發現是:
lib(.so檔)的symbolic link 不正確

解決方法如下:
cd /usr/lib
ln -s libXtst.so.6 libXtst.so

如果在/usr/lib的目錄下找不到 libXtst.so 檔,那麼就表示系統沒有安裝libXtst的函式庫。
解法如下:
apt-get install libxtst-dev

2010年1月1日 星期五

在Ubunut 9.04 安裝 Epson-ALCX11 印表機

問題:
Epson官網不提供 型號AlCX11 印表機的linux Drive。
因此,若想在linux安裝此印表機,必須有第三方提供該印
表機的drive。

解決方法:
下載第三方drive:
載點


安裝:

  • change to root
  • apt-get install libcupsys2-dev
  • apt-get install libstdc++5
  • tar -zxvf Epson-ALCX11-filter-1.1.tar.gz
  • cd Epson-ALCX11-filter-1.1
  • ./configure --prefix=/usr/
  • make install
  • aa-complain cupsd

2009年11月21日 星期六

Ubuntu & Dabian Deb包製作(1)

使用時機:

我在linux下寫了一隻AP(或別人已寫好的),想把他怖署成一個安裝檔,改如何做呢?
在Red hat 下軟體套件的格式是RPM,而在ubuntu下則是deb 。本文教你如何在ubuntu下製作個人的軟體套件包。


使用環境:

ubuntu & Dabian 系列的linux作業系統




實作方式:

(一)

安裝開發的必需套件:

  •  build-essential
  •  debhelper
  •  fakeroot


(二)

實現方法:在 commadn line 執行如下的指令

  •  apt-get △ install △ build-essential
  •  apt-get △ install △ debhelper
  •  apt-get △ install △ fakeroot


(三)

目錄架構:如下圖




其中:changelog、control、rules 是文件名稱,其餘的則是目錄。

而這三個文件則是我們要撰寫的script 與設定檔。

2009年11月18日 星期三

dpkg & rpm

安裝

Result
rpm
dpkg
安裝指定套件
rpm -i pkgfile.rpm
dpkg -i pkgfile.deb

查詢

Result
rpm
dpkg
顯示所有已安裝的套件名稱
rpm -qa
dpkg -l (小寫 L)
顯示套件包含的所有檔案
rpm -ql pkgname (小寫 L)
dpkg -L pkgname
顯示特定檔案所屬套件名稱
rpm -qf /path/to/file
dpkg -S /path/to/file
查詢套件檔案資訊
rpm -qip pkgfile.rpm (顯示套件資訊)
rpm -qlp pkgfile.rpm (小寫 L, 顯示套件內所有檔案)
dpkg -I pkgfile.deb (大寫 I )
dpkg -c pkgfile.deb
顯示指定套件是否安裝
rpm -q pkgname (只顯示套件名稱)
rpm -qi pkgname (顯示套件資訊)
dpkg -l pkgname (小寫 L, 只列出簡潔資訊)
dpkg -s pkgname (顯示詳細資訊)
dpkg -p pkgname (顯示詳細資訊)

移除

Result
rpm
dpkg
移除指定套件
rpm -e pkgname
dpkg -r pkgname (會留下套件設定檔)
dpkg -P pkgname (完全移除)

在 Debian  & Ubuntu 使用 alien 處理 RPM 套件
alien 可處理 .deb、.rpm、.slp、.tgz 等檔案格式, 進行轉檔或安裝.
於 Debian & Ubuntu 安裝非 Debian 套件時, 可使用 alien 進行安裝.
安裝 alien 套件: apt-get install alien

2009年11月16日 星期一

在Ubunut 上看ppstream

如何在ubuntu上看ppstream呢?!

Slove:

加入ppa來源
  • sudo gedit /etc/apt/sources.list
  • deb http://ppa.launchpad.net/portis25/ppa/ubuntu karmic main
  • deb-src http://ppa.launchpad.net/portis25/ppa/ubuntu karmic main

安裝方式
  • sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 27F5B2C1B3EAC8D9
  • sudo apt-get update
  • sudo apt-get install totem-pps
  • totem—>編輯—>插件–>選 pstream

Discuss:
PPStream也有linux版的,但和windows版最大的不同在於:不支援P2P的功能,而是使用內建播放器totem 或 mplayer的網路串流播放。因為沒有使用P2P,最大的缺點在於無法享受流暢的播放品質而速度
快慢決定在於頻寬的大小。

2009年11月12日 星期四

解決Linux 下 umount 時 出現 "Device is busy 問題

問題發生原因:
當我們把目錄mount到儲存設備,要umount 時 出現:『Device is busy』訊息時,
要如何解呢?! 問題發生的原因是有程式還在原來mount的目錄上執行,導致umount 失敗。
解決的方法就是找到佔用目錄的程式並kill掉它

失敗狀況演示

解決方法:

使用:fuser 查詢那隻行程佔用目錄

範例:
假設現在 USB 隨身碟是 mount 到 /media/disk 。
  •  查詢: fuser -m /media/disk
  •  顯示: /media/disk : 25023
就代表是 process 25023(pid) 使用到此目錄,

我們可以使用以下這二種方法來釋放掉資源:
  1.  kill -9 25023
  2.  fuser -m -k /media/disk

2009年11月11日 星期三

解決 linux root filesystem failed 的問題

問題發生原因:
linux 開機後 不能直接進入 x windows ;之前都還用的好好的,怎麼突然開個機就出問題 ?!
後來,發現是:檔案系統出問題了,導致開機後直接進入命令列模式。

(一)
開機後的狀況


(二) 連打:startx 都無入進 xwindows
狀況2



解決方法:
  1. 切到root 身份下這樣的指令進行修復:fsck \
  2. 修復完畢重新開機

演示