今天補完期中考前的最後一篇筆記
最近"有時間的話"也會把前面有漏或有誤的 地方做更正
這次上課主要在講寫程式的環境,跟程式本身較無關係


《sudos》
某些程式要執行時必須切換成root權限,很麻煩
sudos可讓程式在執行某些指令時切換權限
讓一般使用者能有更進階的權限
好處是對方不需要知道root密碼
不會知道你的密碼後,哪 天心血來潮把你的硬碟資料全砍了

sudoers的資料都放在/etc/sudoers
要看的話必須先有root權限
cd /etc
gedit sudoers



想知道詳細內容,請參考man sudoers此處

《make》
當寫的程式越來越大,要怎麼控管他?
答案是使用make來編譯(參考網頁

myapp: main.o 2.o 3.o
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h


先來看書上的範例, Makefile最簡單的寫法如下圖
要產生myapp跟後面原始碼(main.o、2.o、3.o)有關
會執行下一行的指令



如果Makefile不叫Makefile
改用make -f 檔案名稱,如make -f Makefile1

如果今天我們把其中一個檔案給更名
mv main.c main.cc
他會說找不 到main.c,就不能編譯了

如果Makefile裡面沒有all這行,他會去執行第一行

假設今天我把2.c改了,輸入touch 2.c
(touch會將檔案修改時間變成現在時間,內容不變)
因為2.c跟 2.o有關,2.o跟myapp有關
所以編譯2.c跟執行檔
若是touch 3.c,就編譯3.c跟執行檔



configure - 跟make有關,但我沒聽到,再補

《安裝 ncftp 原始碼》
現在開始下載一個原始碼檔案來練習
apt-get source ncftp(裝完 source file 會幫你去解開)
cd ncftp- 3.2.1/
cd ncftp

ll *c(觀看底下所有的C語言檔案)



看到底下有一堆C語言的檔案
如果程式太大(如kernal) 全部編譯可能要編譯一個小時
如果手動打的話一天都編譯不完
所以需要make自動幫有更改的程式編譯

ncftp- 3.2.1/
輸入make應該會開始編譯
當你小改一個檔案再編譯,重編譯的東西會少很多

《Macros》
課本範例第二個版本(Makefile2)多了幾個macros
需要用的時候再展開
ex.
CC = gcc
$(CC) -o myapp main.o 2.o 3.o




make -p > make- rules
看一下make可以加什麼屬性在檔案中


《Makefile 前面的符號》

後面為註解

- 錯誤忽略(有錯繼續執行下一 行)

@ 編譯時不要顯示內容

可以參考前面ncftp-3.2.1/的Makefile


《Makefile的特殊指令》

make clean - 移除編譯的檔案
必須在Makefile中宣告才有作用
如 Makefile3中的

clean:
        -@rm main.o 2.o 3.o >& /dev/null


install - 從Makefile中讀取指令,安裝到指定的位置

最後加\代表此行跟下一行是連在一起的(讓你方便看)
就像終端機的;符號
ex. date;w - 等同輸入date再輸入w



du - 看目錄大小

外面輸入的規則會覆蓋內建的規則
範例:make CC=g++ -f Makefile2
原來內部寫CC-=gcc,現在變成 g++



make -j4 - 同時做四件事情,理論上比較快
(越大的專案效果越明顯)

gcc -MM *.c - 顯示每個檔案跟誰有關連



‧Suffix and Pattern Rules
老師講太快放棄(也不太重要的樣子)

‧Managing Libraries with make
又講太快,請參考man ar
或是Makefile5的範例


《Subversion  版本控制》
以下老師操作太快又沒有抄到
請自行用Google搜尋相關內容

apt-get install subversion - 安裝

svn co
svn info
svn update
svn -r 5296 update
...etc


《壓縮跟解壓縮》

‧將檔案包起來但是沒壓縮
tar cvf myapp-1.0.tar main.c 2.c 3.c *.h myapp.1 Makefile5

‧gzip壓縮 - gzip myapp-1.0.tar
‧gzip解壓 - gzip -d myapp-1.0.tar.gz

‧tgz壓縮 - tar zcvf myapp_v1.tgz *
‧tgz解壓 - tar zxvf myapp_v1.tgz

上面壓縮部分用*,是先將檔案都丟到同一個目錄中
如果要個別指定檔案名稱,用以下方式
tar zcvf myapp_v1.tgz main.c 2.c 3.c *.h myapp.1 Makefile5

‧在/ncftp-3.2.1中操作
tar zcf ncftp.tar.gz ncftp
tar jcf ncftp.tar.bz2 ncftp
ll -d ncftp*
 - 發現bz2壓的比較小

‧bz2壓縮 - tar jcvf myapp_v1.tar.bz2 main.c 2.c 3.c *.h myapp.1 Makefile5
‧bz2解壓 - tar jxvf myapp_v1.tar.bz2




《期中考題目要點》


1. 考make的觀念
2. 要會解壓縮跟產生壓縮檔
3. 考試的時候要能登入到linux的環境(要自己準備虛擬機器)

不過關於壓縮解壓縮...直接用檔案總管的封存不就好了嗎?
誰會去記這麼麻煩的指令啊...

創作者介紹

正因為活著

蕭雲 發表在 痞客邦 PIXNET 留言(0) 人氣()