2009-06-20
2008-09-03
【LP】程式讀取參數列
在Linux下寫程式要讀取參數列的參數(值),最直覺的作法莫過於直接使用main()中的argc與argv變數,不過要自己在程式中處理參數列並且想要提供使用者靈活的參數組合,恐怕會是一個叫人頭痛的"超級任務"。
以ls程式為例,其參數項目就已經玲瑯滿目(如:-l、-a...等),參數項豐富頂多就是在程式中的switch...case敘述多寫一點,但是再加上沒有參數值的參數項可以合併在一個破折號後面(如:-la),這就很麻煩了。
在Linux下可使用getopt()函數來幫我們處理參數列的問題,其prototype如下:
int getopt(int argc, char *argv[], const char * optstring) ;使用上很簡單,getopt函數前兩個參數就將main函數宣告的參數項(argc與argv)填入就是了,重點在於optstring,直接用例子來說明:
extern char *optarg ;
extern int optind, opterr, optopt ;
#include <stdio.h>將此範例存檔為lab_arg.c並編譯成lab_arg:gcc -o lab_arg lab_arg.c
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt ;
while( (opt=getopt(argc, argv, "x:yz")) != -1 ) {
switch(opt) {
case 'x':
printf("option: %c argument: %s\n", opt, optarg) ;
break ;
case 'y':
case 'z':
printf("option: %c\n", opt) ;
break ;
case '?':
printf("unknow option\n") ;
}
}
return 0 ;
}
此程式可接受參數x、y、z,並且參數x其後會接著一個參數值,可以先執行看看其效果。在optstring部分範例中用了"x:yz",其表示此程式接受參數有x、y、z,而在x後面加一個冒號(:)說明x參數將會帶一個參數值。
getopt會依序解析使用者傳入的參數項,若符合optstring規則的參數會回傳對應的參數字元,當getopt函數解析完餐數個數後,會傳回-1表示結束,因此使用一個while迴圈將之包附並檢查傳回值是否為-1。
使用getopt()我們僅需關注程式中對於各個參數項的對應行為即可,而不需費盡心思自己在程式中解析複雜的參數組合可能。
更詳細的getopt()函數說明請參閱:http://fair.athost.net/main/linux_c/function/16.html#linuxc293
@
晚上10:57
0
Reply
Tag:
C,
Linux,
Linux Programming
2008-08-26
建立Toolchain
當我們在編譯某些Library或是open source的程式時,會遇到target board廠商所提供的toolchain版本過舊/新而產生版本差異引發的錯誤,此時可以藉由自己建構特定版本的toolchain來解決此類的問題。
那究竟如何建構自己的toolchain呢?其實也不難,跟在一般的PC上建構編譯環境是一樣的,只是我們是要跨平台的編譯環境而已,因此不外乎就是安裝binutils、gcc、glibc和header這些編譯需要的元件。
如果覺得很陌生也無所謂,網路上已經有高手寫好自動安裝編譯的script了,我們只需要取得該script檔案並且選擇想要的gcc版本跟glibc版本之後,就可以讓電腦自動完成安裝,接下來我們所需要做的事就是好好品味一下咖啡的香!
- 下載crosstool的build script
開啟http://kegel.com/crosstool/連結,進入download頁面下載crosstool-0.43.tar.gz,記得一定要選擇0.43版本,0.42版在gcc版本驗證的正規表示式限制住只能安裝3.x版本。 - 將檔案解壓縮並進入該目錄
# tar zxvf crosstool-0.43.tar.gz
# cd crosstool-0.43 - 然後依據target的機器選擇script檔,在此選擇demo-arm.sh:
1 TARBALLS_DIR=$HOME/downloads
1 安裝過程中會下載需要的tarball檔,選擇暫存這些檔案的目錄,預設為家目錄下的downloads。
2 RESULT_TOP=/opt/crosstool
3 export TARBALLS_DIR RESULT_TOP
4 GCC_LANGUAGES="c,c++"
……
5 eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest
2 選擇toolchain的安裝根目錄,預設會裝在/opt/crosstool目錄下。
3 只是把剛剛定義定變數暫時丟給環境變數,方便其他shell取用而已。
4 這裡可以把需要的編譯語言加進去,比如java等。
5 你會在這個script檔中看到很多行類似的敘述,這就依需要的版本做選擇就可以了,前面有加井號(#)的表是不採用,沒有加井號的就是我們選擇的版本,因此千萬記住只能有一行是沒有加井號! - 接著建立安裝目錄,並且更改目錄的擁有者為目前登入的帳號:
# sudo mkdir /opt/crosstool
# sudo chown $USER /opt/crosstool - 上述基本動作都做完後,下最後一道指令就可以去喝咖啡了!
# sh demo-arm.sh - 咖啡喝完回來發現:什麼還在跑!sorry剛剛忘了說要多吃一塊pizza,出去再回來後應該就差不多啦,當你看到DONE.提示字串,那就恭喜老爺賀喜老爺:是個活跳跳的toolchain。現在可以透過命令:
#/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc - 用這樣一長串命令來進行編譯了,每次編譯都打這一長串,只要是人一定會受不了的,因此我們將此路徑加入預設路徑(建議就把這路徑寫入~/bashrc這樣就不用每次登入都要設定路徑):
# export PATH=$PATH: /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc
【關鍵字:toolchain、cross compiler、ARM、跨平台編譯器】
2008-06-21
2008-06-16
訂閱:
文章 (Atom)







