最近做乙個專案的時候,由於多個檔案聯編,苦於每次修改乙個檔案後輸入大量的編譯命令,所以索性編寫乙個makefile,方便之後的除錯。這裡總結一下makefile的使用問題。
1、首先就是老生常談的tab問題,在命令列前面要用【tab】分隔開,例如
【tab】$(cc) -o $@ $^ $(libs) $(incpath)
這裡的各個符號一般都能查到,$@:目標檔案。$^所有的依賴項。libs和incpath是我自己定義庫檔案和目錄
其實命令書寫的規則與在終端用gcc或者g++完全一樣。
2、第二個問題就是『:=』和『=『的問題
網上有些說法是:=和=是大致相同的,不同的地方在於:=不能使用後面的項。這裡說的是自己定義的變數,可以用』:『或者』:=『
而不是規則。(我就犯了這個低階的錯誤qaq)
$(target) = $(object)
[tab]$(cc) -o $@ $^ $(libs) $(incpath)
會提示錯誤:makefile***:recipe commences before first target
這裡就是因為=的原因,將『=』替換為『:』就不會發生錯誤。
3、第三個問題是gcc -c 和 -o 的問題
這裡不知道為什麼在乙個命令語句中,既使用-c生成也使用-o,會提示gcc不能對多個檔案使用兩個引數的錯誤。
所以我將-o選項去了之後,就不提示錯誤了。
4、clean。
clean之前最好用.phony:clean宣告偽目標
這裡有兩個原因:
首先用偽目標的話會避免在同目錄下有與clean或者其他偽目標同名的檔案。比如沒有宣告clean為偽目標,這時在同目錄下有個
檔案的名字是clean,這時執行make clean就不會起作用。
還有乙個用處是遞迴makefile時用到,這裡就不提了。
makefile編譯問題
porting http 時遇到 makefile因為編譯時編碼的問題,導致無法編譯的問題。開始報錯是提示,api的倚賴項上,缺少分割符號,仔細檢查了下 和 都寫的很規矩啊。檢視另乙個可以編譯的資料夾的makefile,發現寫法完全相同,只是他對的很齊,心想難道這裡還有這種原因,抱著除錯時期懷疑一切...
makefile 問題備忘
一.備忘 1.clean rm edit objects 而在rm命令前面加了乙個小減號的意思就是,也許某些檔案出現問題,但不要管,繼續做後面的事。2.萬用字元匹配只能在規則裡面或者命令裡面,變數裡面不能直接使用萬用字元,只能夠使用函式來做這些事情比如wildcard。3.vpath 4.c.o 注...
遇到的問題
1 若class cnmdevctrlprotocol virtual public cnetcomm則starttimer編譯通不過 2 activex在ie下載入多個,相當於多執行緒,所以這時候的activex不要使用全域性變數,當時如果編寫動態庫也不要使用全域性變數 3 btn灰顯或sleep...