星期四, 9月 06, 2007
好用又免費的燒錄軟體 - InfraRecorder
還好, 皇天不負苦心人(當然再加上google的大力幫忙), 終於讓我找到了一個還不錯的燒錄軟體可以用, 那就是InfraRecorder.
這套軟體的使用介面相當簡單好用, 而且又同時支援燒錄CD與DVD, 更讚的是, 還是open source. 真是俗又大碗! 推薦大家可以多多使用.
相關連結:
InfraRecorder
Nero
Sony VAIO SZ 38
星期日, 8月 26, 2007
推薦好用又免費的錄音以及編輯軟體Audicity
(例如: Windows內建的錄音程式)的錄音格式無法儲存成mp3格式, 所以通常都會佔用很大的硬碟空間. 雖然現在硬碟很便宜, 空間又大, 可是檔案大畢竟就是不容易備份, 而且有些錄音軟體還都有錄音時間限制, 用起來實在是非常不方便. 在這裡跟大家推薦一個好用, 免費又open source的錄音軟體, Audacity.
推薦這套軟體有一個很重要的原因, 因為Audicity是可以同時在Windows以及Linux上執行的軟體, 甚至是MAC OS X(我沒有MAC, 所以沒試過). 這一直是我找尋軟體一個很重要的因素之一, 畢竟大部分都的user是很懶的, 都希望學會一招後就"行騙"天下.
另外, Audicity還可以直接以mp3格式儲存錄音內容, 減少錄音檔案所佔用的硬碟空間. 不過, Audicity預設是沒有這個功能, 要再安裝MP3 encoder才可以有這個功能. 還好這個步驟非常簡單, 只要下載MP3 encoder外掛即可:
- 首先先至http://lame.buanzo.com.ar/下載libmp3lame-win-3.97.zip這個檔案.
- 將下載的libmp3lame-win-3.97.zip解開
- 接著就可以使用Audicity進行錄音的動作
- 錄音完畢後, 選擇檔案->匯出為MP3, 將檔案轉存成MP3
- 這時候會出現視窗請你告訴Audicity所要使用的LAME MP3 Encorder檔案在哪裡
- 選擇Yes, 並找出在步驟2所解開的lame_enc.dll即可
最後, 除了前面所介紹的錄音功能之外, Audicity還可以對錄音檔案進行編輯的動作, 不過這部分小弟不太需要用到, 所以沒有用過, 無法為各位介紹囉, 真是不好意思.
相關連結:
好用又免費的虛擬桌面工具
在Linux上虛擬桌面幾乎是每個desktop manager都一定會提供的功能, 可是在Windows上則沒有了. 其實再Windows上也是有一堆好用又免費的虛擬桌面軟體可以用的, 在這裡我跟大家推薦一個我自己覺得用起來還不錯的虛擬桌面軟體dexpot.
dexpot這套虛擬桌面軟體允許你最多有20個虛擬桌面, 相信這對大部分的使用者來說都已經夠用了. 而且每個虛擬桌面可以設定個別的密碼保護, 避免別人偷偷切換你的虛擬桌面, 偷看你在做什麼. 每個虛擬桌面也可以各自設立桌布, 讓你可以在處理不同事情, 根據事情的特性使用不同的桌布. 還有, 還可以設定hot key, 快速切換桌面, 以免做壞事被抓包喔.
相關連結:
dexpot
星期五, 8月 24, 2007
利用gdb進行shared library的除錯
寫程式時, 遇到bug最常使用的除錯工具就是gdb了. gdb會利用ld.so這個dynamic linker/loader, 自動將我們的程式載入記憶體, 並且在執行過程中將程式所使用到的shared library載入. 然而, 如果我們要debug的是已經compile成shared library的function時, 這種on-demand loading的運作方式則會造成我們的不便, 因為我們無法預先設定breakpoint以便在程式呼叫到shared library中的function時, 將程式執行暫停.
因此, 如果要以gdb對已經compile成shared library的function進行除錯時, 可以採用下列方式來進行在shared library中的function的除錯工作:
- 首先, 當然是在編譯shared library時, 必須有debug information, 也就是compile時要加上-g的option
- 再來就是告訴ld.so, 在載入程式時,一併載入我們所要debug的shared library, 只要利用LD_PRELOAD環境變數即可. LD_PRELOAD是告訴ld.so, 在程式一開始載入時, 就順便一起載入LD_PRELOAD環境變數所指定的shared library.
- 執行gdb進行程式除錯, 並且先隨便設定一個中斷點
- 輸入run讓gdb開始執行程式, 此時gdb應該會一下子就暫停程式的執行. 這時候就可以確定一下我們要debug的shared library是否已經載入
export LD_PRELOAD=要debug的shared library路徑
break main
info share
此時應該就可以找到我們在shell中利用LD_PRELOAD環境變數要求ld.so載入的shared library了. 接下來就可以設定shared library中的function為中斷點並且進行debug了.
星期三, 8月 22, 2007
好用又免費的電子字典
可是,De. Eye畢竟是一套商業軟體,是要花錢購買的。對於沒有此預算,可是又有此需求的人,那該怎麼辦?其實,有一套功能很接近Dr. Eye的免費軟體可以供大家使用,就是StarDict。
StarDict是一套open source的軟體,而且又同時支援Windows與Linux作業系統,還可以自行新增字典字庫,實在是一套不錯的軟體。當然,除了基本字典查功能之外,StarDict也跟Dr. Eye一樣,支援即時翻譯,也就是滑鼠到哪就自動翻譯滑鼠所指的字。而且,從3.0版開始,更支援了全文翻譯的功能,強力推薦這套軟體。
相關連結:
星期二, 8月 21, 2007
免費產生pdf的工具
可是,如果是要產生出pdf格式的文件,在Linux當然也有許多免費好用的工具可以使用。但是,在Windows上,以往大家可能都是使用Adobe Acrobat。可是這是一套商業軟體,要錢的,如果沒錢買的話,其實可以使用一些免費的軟體,也都不錯喔。
在這裡推薦一下CutePDF Writer。這是一套商業軟體,不過重點是,它是免費的,所以大家可以安心使用。而且不會在所產生的pdf檔案上,留下任何的watermark,是一套相當不錯的pdf產生工具。
相關連結:
檔案比較工具
tkdiff是diff的圖形化front-end,其本質上仍然是使用diff進行檔案比比對的動作,只是幫diff包了一個漂亮的圖形外觀。除此之外,tkdiff還可以進行檔案merge的動作。還有一點值得特別強調一下,就是tkdiff不只可以對一般檔案進行比比對,也可以對source control system中的檔案進行比對動作。
tkdiff的使用方法很簡單,可以只輸入tkdif進入interactive模式,直接選取要比對的檔案,或是在命令列直接輸入要比較即可。
fldiff也是一個圖形化的檔案比對工具,其基本功能跟tkdiff差不多,都是可以比較一般的檔案以及source control system中的檔案。不過fldiff比tkdiff多了一個目錄內容比對功能,就是可以指定兩個目錄,然後針對目錄中相同名稱的檔案進行內容比對的功能。
tkdiff有已經編譯好的Windows版本,fldiff需要自己編譯。
相關連結:
星期日, 8月 19, 2007
在Ubuntu中安裝Adobe Reader
1. 先加入金鑰
wget -q http://medibuntu.sos-sts.com/repo/medibuntu-key.gpg -O- | sudo apt-key add -
2. 在/etc/apt/sources.list中加入repository
## Medibuntu - Ubuntu 7.04 "feisty fawn"
## Please report any bug on https://launchpad.net/products/medibuntu/+bugs
deb http://medibuntu.sos-sts.com/repo/ feisty free non-free
deb-src http://medibuntu.sos-sts.com/repo/ feisty free non-free
3. 安裝套件acroread
參考連結:
在Ubuntu中安裝Microsoft字型
其實,我們可以有很多方法可以美化Ubuntu的桌面環境。以下我介紹一個最簡單的方法。
1. 先在/etc/apt/sources.list中,啟用multiverse repository
2. 利用Synaptic套件管理程式,安裝msttcorefonts以及ttf-xfree86-nonfree兩個套件
3. 重新開啟應用程式或是重新開啟X Windows
你就可以發現,你的桌面環境的字型變得比較好看了喔。
ps. Windows和Linux都是我喜愛的作業系統,也都覺得很不錯,各有優缺點。只是覺得微軟的產品如果可以再便宜一點,那就更好了。
相關連結:
RestrictedFormat/Microsoft Fonts
星期六, 8月 18, 2007
IMMS: 自動找出喜愛聽的音樂
Intelligent Multimedia Management System (IMMS)就是一個可以根據你聽音樂的習慣,自動將你的音樂分出喜愛以及不喜愛部份,然後根據此分類結果自動地調整播放的內容,完全不需要使用者進行任何額外的設定動作來分出喜愛與不喜愛的部份。其運作原理很簡單,完全是根據聽音樂時的正常反應。什麼是聽音樂時的正常反應?那就是,遇到不喜歡聽的歌就跳過的這個動作。IMMS會紀錄你在收聽音樂的過程中,跳過了哪些音樂,這些音樂的喜好程度分數就會逐漸降低,所以一段時間後,自然就會有你對每首音樂的喜好程度分類。
安裝完IMMS之後,在BMP Preferences->Plugins->General頁面中,將IMMS enable的選項打勾即可。
使用IMMS一開始要有一點耐心,必須給它一點時間讓他認識你的音樂喜好,之後就可以根據你的喜自動選出喜歡的音樂播放了。
參考網址:
在Linux中聽mp3的好用工具
BMP是以XMMS為基礎所開發出來的,其外觀很像Winamp,使用起來非常簡單。不過,初次使用時有一個問題,就是播放清單無法顯示在Windows中抓到的檔案,會出現一大堆問號之類莫名其妙的字。此問題的原因主要是因為在Linux下,BMP採用的預設編碼是UTF-8,可是我們在Windows下抓到的檔案,中文檔名是採用Big5編碼,所以播放清單才會出現亂碼。所以只要告訴BMP將雲本屬於Big5的檔名轉換成UTF-8即可。設定步驟說明如下:
1. 打開BMP Preferences設定頁面
2. 在左邊的Categoreis中選擇Plugins
3. 在右邊的Media頁面選取MPEG Audio Plugin
4. 按下下方的偏好設定按鈕
5. 在出現的MPEG Audio Plugin Configuration視窗中,選取Title頁面
6. 將Convert non-UTF8 ID3 tags to UTF8打勾
7. 在ID3 encoding中輸入Big5
套用設定後就大功告成了
詳細解決方法可以參考http://wiki.ubuntu.org.tw/index.php/HowtoMusic。
其他參考:
星期五, 8月 17, 2007
samba使用tdb database file儲存重要資訊
smbd -b |grep PRIVATE_DIR
這些tdb database file最好定期備份,以便在系統運作出現錯誤時可以進行回復,samba套件提供了一個工具[wiki:tdbbackup tdbbackup]可以幫助我們備份這些檔案。這些檔案在samba的文件稱為presistent TDB file。
另外,samba在執行時期的資訊放在:
smbd -b|grep LOCKDIR
這些檔案在samba文件稱為temporary TDB file。
以下分別列出presistent TDB file以及temporary TDB file的名稱與功能:
- Presistent TDB file
- account_policy: Samba/NT account policy settings, includes password expiration settings.
- group_mapping: apping table from Windows groups/SID to UNIX groups.
- ntdrivers: Stores per-printer installed driver information.
- ntforms: Stores per-printer installed forms information.
- ntprinters: Stores the per-printer devmode configuration settings.
- passdb: Exists only when the tdbsam passwd backend is used. This file stores the SambaSAMAccount information. Note: This file requires that user POSIX account information is availble from either the /etc/passwd file, or from an alternative system source.
- registry: Read-only Samba database of a Windows registry skeleton that provides support for exporting various database tables via the winreg RPCs.
- secrets: This file stores the Workgroup/Domain/Machine SID, the LDAP directory update password, and a further collection of critical environmental data that is necessary for Samba to operate correctly. This file contains very sensitive information that must be protected. It is stored in the PRIVARE_DIR directory.
- share_info: Stores per-share ACL information
- winbindd_idmap: Winbindd's local IDMAP database.
- Temporal TDB file
- brlock: Byte-range locking information. 不需要備份
- connections: A temporary cache for current connection information used to enforce max connections. 不需要備份
- eventlog/*tdb: Records of eventlog entries. In most circumstances this is just a cache of system logs. 不需要備份
- gencache: Generic caching database for dead WINS servers and trusted domain data. 不需要備份
- login_cache: A temporary cache for login information, in particular bad password attempts. 不需要備份
- messages: Temporary storage of messages being processed by smbd. 不需要備份
- netsamlogon_cache: Caches user net_info_3 structure data from net_samlogon requests (as a domain member). 不需要備份
- perfmon/*.tdb: Performance counter information. 不需要備份
- printing/*.tdb: Cached output from lpq command created on a per-print-service basis. 不需要備份
- schannel_store: A confidential file, stored in the PRIVATE_DIR, containing crytographic connection information so that clients that have temporarily disconnected can reconnect without needing to renegotiate the connection setup process. 不需要備份
- sessionid: Temporary cache for miscellaneous session information and for utmp handling. 不需要備份
- unexpected: Stores packets received for which no process is actively listening. 不需要備份
- winbindd_cache: Cache of Identity information received from an NT4 domain or from ADS. Includes user lists, etc. 需要備份
星期日, 8月 12, 2007
好用的寫程式工具
首先是程式編輯器。我個人比較現在常用的是Notepad++以及PSPad兩套軟體。這兩套軟體提供了大部分UltraEdit中的功能,而且都提供了中文使用介面。不過,PSPad有提供檔案比較功能,但是Notepad++好像沒有提供檔案比較的功能,這對於常常必須在檔案之間比較內容實在很不方便。所以就上網google一下,果然發現了一個好用、免費還open source的檔案比較工具,那就是WinMerge。
WinMerge是一個open source project,其除了提供了檔案比較的功能,也同樣有中文使用介面。
參考網址:
1. UltraEdit http://www.ultraedit.com/
2. Notepad++ http://notepad-plus.sourceforge.net/tw/site.htm
3. PsPad http://www.pspad.com/
4. WinMerge http://winmerge.org/
星期六, 8月 11, 2007
星期四, 8月 09, 2007
trace samba source code 心得筆記 6
所謂的stackable VFS功能指的是在進行檔案存取時,samba額外對該service進行的處理動作,這是在samba的第3版之後才加入的新功能。你可以在一個service上套用多個vfs modules,samba混根據smb.conf設定檔案所列出的先後順序,依序套用所列的vfs module。在samba套件中也有幾個vfs objects可以使用,這些module放在samba安裝目錄下的lib目錄中(/usr/lib/samba/vfs或是/usr/local/samba/lib/vfs):
audit
這個vfs module可以將存取檔案的紀錄寫到syslog中,
default_quota
default_quota可以設定user或是group的quota。
extd_audit
這個module原則上與audit一樣,除了將檔案存取紀錄寫到syslog中,還會寫一份到samba本身的log檔。
recycle
這個module是模擬Windows上的資源回收筒的功能,也就是刪除sambaer server上的檔案時,samba會將你刪除的檔案搬移到一個隱藏目錄中,預設是.recycle目錄,不過也可以透過repository選項設定要當作資源回收筒的路徑。
有些vfs module可能很簡單,有些則有選項可供設定。其設定的語法是以
module: option = value
的格式來指定所要設定的選項,例如指定資源回收筒的路徑為/tmp:
[myshare]
vfs objects = recycle
recycle: repository = /tmp
如果選項的設定值不只一個,而是有多個所形成的list,則每個設定值之間用應逗號隔開。例如:
[myshare]
vfs objects = access_control
access_control: allow_host = pc1
access_control: deny_host = pc2, pc3
當你自行開發vfs module時,samba已經有提供處理上述vfs module選項的相關function。在 loadparm.c檔案中,有許多有關選項處理的function。其中
const char *lp_parm_const_string(int snum, const char *type, const char *option, const char *def)
以及
const char **lp_parm_string_list(int snum, const char *type, const char *option, const char **def)
是兩個可以用來得到service的選項設定值或設定列表的function。其中,
snum是連線id,可以透過SNUM(conn)取得。
type就是vfs module的名稱,例如:recycle, access_control。
option是指定要讀取的選項名稱,例如:repository, allow_host, deny_host。
def是預設值,也就是在smb.conf中沒有針對該選項進行設定時,vfs module預設要採用的設定值。
而lp_parm_const_string()與lp_parm_string_list()兩個差別在於,不管設定值的個數有幾個,t_string()會將所有選項(包含分隔選項的逗號)當作一個字串傳回,而lp_parm_string_list()則會將每個選項以一個字串儲存,所以會傳回一個字串陣列。例如:
lp_parm_const_string(SNUM(conn), "access_control", "allow_host", NULL) => "pc1"
lp_parm_const_string(SNUM(conn), "access_control", "deny_host", NULL) => "pc2, pc3"
lp_parm_string_list(SNUM(conn), "access_control", "allow_host", NULL) => {"pc1"}
lp_parm_tring_list(SNUM(conn), "access_control", "deny_host", NULL) => {"pc2", "pc3"}
星期三, 8月 08, 2007
trace samba source code 心得筆記 5
其中[global]這個service是比較特殊的,其定義了套用於整個samba server的種種設定。由於samb a server的設定選項非常繁多,所以如果沒有寫在smb.conf檔案中,則該選項會採用samba的預設值。
要看目前samba的系統設定,可以輸入
testparm
觀看系統設定概要。
若要得到完整的系統設定,可以輸入
testparm -v
smb.conf所使用的設定格式也很簡單,採用以 = 隔開的key/value pair方式。若在一行設定前面加上 ; 的話,則samba server會將這一行視為註解。
以下為一簡單的設定檔範例:
[global]
netbios name = mypc
workgroup = mygroup
[homes]
read only = No
browseable = No
create mask = 0600
directory mask = 0700
[usb_storage]
path = /media/disk
admin users = jacky
write list = jacky
read only = No
星期二, 8月 07, 2007
trace samba source code 心得筆記 3
在samba設定檔smb.conf中,有一個log level選項,主要是用來控制debug message的列印等級。其設定方式為
log level = n
n即為samba執行時的global debug等級。
此外,samba執行時的等級可以根據不同的class給予不同的等級,方便我們進行除錯。其設定方式也是透過log level的選項,
log level = global_level class1:class_level1 class2:class_level2 ...
如此,DEBUG()就可以根據global debug level以及class debug level,決定是否要輸出debug訊息。
目前在samba 3.0.24版中,根據debug.h檔案所列共有下列幾種:
TDB、PRINTDRIVERS、LANMAN、SMB、RPC_PARSE、RPC_SRV、RPC_CLI、PASSDB、SAM、AUTH、WINBIND、VFS、IDMAP、QUOTA、ACLS、LOCKING、MSDFS、DMAPI。
但是,根據實測結果,目前PRINTDRIVERS、LANMAN、SMB、SAM並不支援class level debugging。
trace samba source code 心得筆記 2
smbd -i -dn > debug.txt
將samba以interactive模式執行,如此smaba只會有一個process而不會額外fork出其他process。並且將執行過程的debug訊息導到debug.txt檔案,n的數值為0到10,數值越大debug訊息越詳細。
trace samba source cdoe 心得筆記 1
configure.in
install-sh
makefile.in
方便programmer開發自己的samba VFS module。
只要系統安裝了autoconf package後,並將上述三個檔案以及所開發的samba VFS module的原始程式放在同一個目錄,接著在command line輸入autoconf,系統就會自動產生出相對應的configure script。
接下來只要再輸入
./configure --with-samba-source=samba source code所在目錄路徑
例如:./configure --with-samba-source=/home/zhuang/samba-3.0.24/source
就可以自動產生出編譯samba VFS module的Makefile了。
自動掛載網路芳鄰的目錄
在/etc/fstab檔案中,設定一下要掛載的網路芳鄰的路徑、掛載點以及一些帳號密碼等就可以了。格式為:
網路芳鄰路徑 本機掛載點 smbfs 帳號密碼及權限設定
可參考下例:
//pc1/movie /media/movie smbfs credentials=/etc/credentials.txt,iocharset=utf8,codepage=cp950,rw,uid=1000,gid=1000
第一部份:
//pc1/movie就是在網路芳鄰裡,電腦名稱為pc1所分享出來的目錄movie
第二部分:
/media/movie就是要將目錄掛載到此路徑,方便之後使用
第三部分:
smbfs就是用來怪在網路芳鄰的檔案系統名稱
第四部分:
這部分的設定會因為所分享的電腦設定不同而有所不同。但大致上需要
credentials是設定連線到pc1所需的帳號密碼資訊是存放在檔案/etc/credentials.txt中,檔案內容格式為
username=使用者名稱
password=密碼
接下來的iocharset以及codepage則是分別設定在Linux上以及Windows上所使用的語言設定。這部分則必須根據電腦所使用的設定跟著改變,以免檔案名稱呈現亂碼。
最後的rw,uid-1000,gid=1000則是將掛載進來的目錄設定為可讀寫,並且將掛載點的使用者與群組設定為某個使用者與群組(在這裡均為1000)。
星期一, 4月 30, 2007
如何讓一般使用者也可以利用fuse掛載檔案系統
以root的權限,完成下列幾個步驟:
- chmod 4755 /usr/bin/fusermount
- /sbin/modprobe fuse
- chmod o+rw /dev/fuse
如果user要umount檔案系統,因為其不具有root的權限,所以無法執行umount,同樣需利用fuse所提供的fusermount這個utility來執行卸載的動作。也就是執行
/usr/bin/fusermount -u mount_point
星期二, 4月 24, 2007
max file size == 2GB
一般來說,在Linux系統上,當我們要建立一個大型檔案時,檔案最大可以等於2的31次方-1,也就是大約等於2GB這麼大。會是這個size原因是因為當你在操作檔案時,系統用來管理目前檔案存取位置的off_t是一個32位元的整數。
如果要打破file size最大2GB的限制,那就要在open file時,加上O_LARGEFILE的flag,並且改用off64_t表示資料在檔案中的位移值。另外,在compile時加上-D _GNU_SOURCE,這樣就可以建造出超過2GB的檔案了。
附上一個簡單的範例供大家參考一下。此範例的目的主是要建立一個檔案大小大約3GB的檔案。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int main()
{
int fd;
off64_t file_size;
fd=open("test.dd",O_LARGEFILE|O_CREAT|O_RDWR,0666);
if(fd==-1)
{
perror("open");
exit(1);
}
file_size=1024;
file_size*=1024*1024*3;
if(lseek64(fd,file_size-1,SEEK_SET)==-1)
{
perror("lseek");
close(fd);
}
write(fd," ",1);
close(fd);
return 0;
}
星期五, 4月 20, 2007
APR == Apache Portable Runtime 簡介
由APR的全名就可以知道,APR原本是屬於Apache的一部份,但是自從Apache 1.3版之後已經被獨立成為一個單獨的project,當然除了Apache之外,也有許多軟體是以APR為基礎或是使用APR進行開發,達到 platform independent。著名的軟體專案包括:Subversion等等。
APR大致上可以分了兩個部分,分別為APR Core與APR Util。APR Core包含了最基本的portable functions,Apr Util則包含其他不屬於Core但也必須是portable的functions。以下針對APR Core與APR Util分別描述所提供的功能。
APR Core提供了以下功能:
- Reading and writing files
- Character set conversion
- Network communications with sockets
- Time management used for Internet type conversions
- String manipulation like C++ including neural order management
- UNIX password management routines
- Table management routines
- UUID Internet generation
- Filename canonicalization
- Random data generation
- Global lock management
- Threads and process management
- Dynamic library loading routines
- Memory mapped and shared memory
APR Util提供了以下的功能:
參考資料
簡介 pkg-config 的功能與用法
pkg-config 命令是可以用來讀取安裝在 linux 系統上的 library 相關資訊。這個程式主要讀取系統中位於 /usr/lib/pkgconfig 目錄或是環境變數 PKG_CONFIG_PATH 所設定的路徑中的負檔名為 .pc 的檔案,這些檔案包含系統安裝的 library 的相關資訊,包括:安裝的目錄、程式編譯的參數等等。
使用方法很簡單
- pkg-config --cflags library-name-with-version 就可以得到編譯程式時,pre-processing 動作必須加上的參數設定。例如:我在自己的電腦上下pkg-config --cflags glib-2.0,其結果為-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include。
- pkg-config --libs library-name-with-version就可以得到 linking 時所必須傳給編譯器的參數。執行 pkg-config --libs glib-2.0 得到-L/lib -lglib-2.0。
將Makefile中的這一行
gcc -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -L/lib -lglib-2.0 program.c
替換成
gcc pkg-config --cflags --libs glib-2.0 program.c