下面我們學習makefile是如何編寫的。
在makefile中也#開始的行都是注釋行.makefile中最重要的是描述檔案的依賴關係的說明。一般的格式是:
target:components
tab rule
第一行表示的是依賴關係。第二行是規則。
比如說我們上面的那個makefile檔案的第二行
main:main.o mytool1.o mytool2.o
表示我們的目標(target)main的依賴物件(components)是main.o mytool1.o mytool2.o 當倚賴的物件在目標修改後修改的話,就要去執行規則一行所指定的命令。就象我們的上面那個makefile第三行所說的一樣要執行 gcc -o main main.o mytool1.o mytool2.o 注意規則一行中的tab表示那裡是乙個tab鍵
makefile有三個非常有用的變數。分別是$@,$^,$《代表的意義分別是:
$@--目標檔案,$^--所有的依賴檔案,$<--第乙個依賴檔案。
如果我們使用上面三個變數,那麼我們可以簡化我們的makefile檔案為:
# 這是簡化後的makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o:mytool1.c mytool1.h
gcc -c $<
mytool2.o:mytool2.c mytool2.h
gcc -c $<
經過簡化後我們的makefile是簡單了一點,不過人們有時候還想簡單一點。這裡我們學習乙個makefile的預設規則
.c.o:
gcc -c $<
這個規則表示所有的 .o檔案都是依賴與相應的.c檔案的。例如mytool.o依賴於mytool.c這樣makefile還可以變為:
# 這是再一次簡化後的makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $<
好了,我們的makefile 也差不多了,如果想知道更多的關於makefile規則可以檢視相應的文件。
3.程式庫的鏈結
試著編譯下面這個程式
/* temp.c */
#include
int main(int argc,char **argv)
這個程式相當簡單,但是當我們用 gcc -o temp temp.c 編譯時會出現下面所示的錯誤。
/tmp/cc33kydu.o: in function `main':
/tmp/cc33kydu.o(.text+0xe): undefined reference to `log'
collect2: ld returned 1 exit status
出現這個錯誤是因為編譯器找不到log的具體實現。雖然我們包括了正確的標頭檔案,但是我們在編譯的時候還是要連線確定的庫。在linux下,為了使用數學 函式,我們必須和數學庫連線,為此我們要加入 -lm 選項。 gcc -o temp temp.c -lm這樣才能夠正確的編譯。也許有人要問,前面我們用printf函式的時候怎麼沒有連線庫呢?是這樣的,對於一些常用的函式的實現,gcc編譯器會自 動去連線一些常用庫,這樣我們就沒有必要自己去指定了。有時候我們在編譯程式的時候還要指定庫的路徑,這個時候我們要用到編譯器的 -l選項指定路徑。比如說我們有乙個庫在 /home/hoyt/mylib下,這樣我們編譯的時候還要加上 -l/home/hoyt/mylib。對於一些標準庫來說,我們沒有必要指出路徑。只要它們在起預設庫的路徑下就可以了。系統的預設庫的路徑/lib /usr/lib /usr/local/lib 在這三個路徑下面的庫,我們可以不指定路徑。
還有乙個問題,有時候我們使用了某個函式,但是我們不知道庫的名字,這個時候怎麼辦呢?很抱歉,對於這個問題我也不知道答案,我只有乙個傻辦法。首先,我 到標準庫路徑下面去找看看有沒有和我用的函式相關的庫,我就這樣找到了執行緒(thread)函式的庫檔案(libpthread.a)。 當然,如果找不到,只有乙個笨方法。比如我要找sin這個函式所在的庫。 就只好用 nm -o /lib/*.so|grep sin>~/sin 命令,然後看~/sin檔案,到那裡面去找了。在sin檔案當中,我會找到這樣的一行libm-2.1.2.so:00009fa0 w sin 這樣我就知道了sin在 libm-2.1.2.so庫裡面,我用 -lm選項就可以了(去掉前面的lib和後面的版本標誌,就剩下m了所以是 -lm)。
linux 檢視終端的命令以及ssh命令
可以使用who命令和w命令 w功能最全,能顯示使用者登入名,終端標誌,星期幾登入和具體登入時間,閒置時間。使用者正在指向的程式,占用cpu時間,系統的執行時間和平均負載 who僅顯示使用者登入名,終端標誌,和登入日期和時間,pst x是因為使用遠端終端登入的。也可以直接使用tty來檢視當前所使用的終...
Linux DNS檢視以及dig命令使用
dig命令 dig是乙個在類unix命令列模式下查詢dns包括ns記錄,a記錄,mx記錄等相關資訊的工具 a address 記錄是用來指定主機名 或網域名稱 對應的ip位址記錄。cname 即 別名記錄。這種記錄允許您將多個名字對映到另外乙個網域名稱。比如設定test.mydomain.com,用...
tac命令以及各種linux檔案檢視命令
有許多命令都可以檢視檔案,不同的命令有不同的優點,可以針對不同的需要分別選擇命令以提高效率 cat 由第一行開始顯示內容,並將所有內容輸出 tac 從最後一行倒序顯示內容,並將所有內容輸出 more 根據視窗大小,一頁一頁的顯示檔案內容 less 和more類似,但其優點可以往前翻頁,而且進行可以搜...