在從事linux開發這10年間,我很少重頭寫makefile,如果是複雜的專案,我會使用ide,不用考慮makefile的問題。簡單的專案,就拿著剛開始學習linux程式設計時的模板修修補補,這些年就過來了,makefile的語法也忘得一乾二淨(話說makefile的語法規則真是亂)
在實現makefile之前,得考慮自己的需求,通常來說,最關鍵的一點就是:
誰也不願意手動將一堆檔案逐個新增到makefile,然後無論是新增、刪除、更名檔案,都需要再來修改這個該死的公司不會給你計入任何工作量的傢伙。例如,我們需要查詢工程目錄下所有的c/cpp檔案:
sobjects:=$(patsubst %.c,%.s.o,$(wildcard *.c) )
sobjects+=$(patsubst %.cpp,%.cpp.o,$(wildcard *.cpp) )
#呼叫shell 命令的find來查詢相關原始檔
sources:=$(shell find . \( -name "*.cpp" -o -name "*.c" \))
#替換原始檔字尾
objs:= $(patsubst %.c, %.o, $(sources))
objs+= $(patsubst %.cpp, %.o, $(sources))
#使用filter只選擇特定字尾的檔案
sobjects = $(filter %.o, $(objs))
下面的模板makefile是我在編寫外設驅動時使用的,包含兩方面需求:
將工程編譯為.so方式提供給其他程式使用 (這是預設選項)
(通常來說,我們只需要生成單獨的.so或者可執行程式,刪減該模板即可。裡面的$@ $< ,我現在也不知道是幹什麼用的了^^
#首先定義庫以及程式的名稱,要根據個人需求修改
libname=libname
#程式中的預處理開關,要根據個人需求修改
#自動查詢目錄下所有符合規則的原始檔,對於.c字尾的檔案,對應生成.so.o字尾的obj
sobjects:=$(patsubst %.c,%.s.o,$(wildcard *.c) )
sobjects+=$(patsubst %.cpp,%.cpp.o,$(wildcard *.cpp) )
#g++的其他引數視個人需要新增(不能減少了)
%.s.o : %.c
g++ $(cflags) -fpic -c -o $@ $<
#其中-std=c++11視個人需求而定
%.cpp.o : %.cpp
g++ $(cflags) -std=c++11 -fpic -c -o $@ $<
#缺省會生成.so
all: $(libname).so
$(libname).so : $(sobjects)
g++ $(cflags) -shared -wl,--soname=$(libname).so -o $@ $^
#可執行需要鏈結的庫也需要根據需要新增,比如我這個工程需要-ldl
clean :
-rm -f *.so *.o
-rm -f $(libname).so
#include "id81m_if.h"
#include int main()
char buf[1024] =;
readcard(buf, 1024, "/tmp");
printf("%s\n", buf);
closeport();
return 0;
}#endif
專案中的小專案實現在望
這段時間研究remoting和reflection,初步的解決了一些問題。例如動態建立自定義物件,在remoting中開啟和關閉指定物件。在做了技術預演的基礎上,昨天和今天完成了應用服務的元件設計的編碼。明天就可以做乙個windows應用程式了。這個程式類似於windows下的 windows服務 ...
獲取專案中所有makefile檔案
bin bash 說明在divison目錄下執行,用於獲取所有makefile檔案,結果會按原目錄結構儲存 function back makes find type f name mm ake ff ile for f in maks do find得到的檔案可能是絕對路徑,此時刪頭去尾得到中間路...
乙個blog小專案中遇到的問題
小專案使用了easyui,在使用中遇到了一些問題,羅列如下,後續再有的,繼續補充。1.封面圖上傳的時候,使用jquery函式,頁面載入即載入方法,需要的效果是,選擇上傳的後,頁面會顯示的縮圖,使用ajax區域性重新整理,所以需要的是onchange事件,錯寫為onclick事件,導致上傳不成功,沒有...