小專案中通用的Makefile

2021-09-10 18:32:44 字數 1790 閱讀 4889

在從事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事件,導致上傳不成功,沒有...