Makefile 學習筆記
??? 五一期間在學校呆著是在無聊,關于那些數據挖掘和算法的理論看的也實在是費勁,突然想練習實踐一下,因為不會makefile編寫的緣故,以前寫程序時只能放到一個文件里,好了,現在開始了。
??? 又因為我畢業設計做的的是一個嵌入式網關,系統用的是uClinux,里面要用的一個WEB服務器,當然要支持CGI了,初步打算用boa,看看boa源碼,不少啊,在看makefile還挺復雜,要用configure的,我在linux下.configure 然后後make了一下,錯誤一大串,還都是鏈接是出錯了,象我這樣的makefile菜鳥一時搞定,可能行不答了,又看了看user目錄下的應用程序,還有一個httpd,這個我熟悉,以前看過,只有兩個文件,好的,那這個練習了,里面現成的Makefile當然是不好使了。
寫一個如下的makefile
#makefile
CC = gcc
EXEC = httpd
OBJS = httpd.o copy.o
HTTPD_DOCUMENT_ROOT = /home/httpd
CFLAGS += -DHTTPD_DOCUMENT_ROOT = \"$(HTTPD_DOCUMENT_ROOT)\"
all:$(EXEC)
$(EXEC):$(OBJS)
??????? $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
.c.o:
??????? $(CC) $(CFLAGS) -c $<
clean:
??????? -rm -f $(EXEC) *.elf *.gdb *.o
多少有參考原Makefile,make時會有錯誤,多make幾次就成功了,運行./httpd
?? 這里的HTTP_DOCUMENT_ROOT這個參數不知怎么回事,我猜測是傳到文件里的參數,但是我在你打印時就會有段錯誤,程序運行後,在瀏覽器里輸入IP,在瀏覽器里列出了文件系統的目錄,可以看是根目錄,不對啊,按照上面傳入的參數因該是/home/httpd才對的,看看httpd.c的源碼
? signal(SIGCHLD, SIG_IGN);
? signal(SIGPIPE, SIG_IGN);
? signal(SIGALRM, sigalrm);
? chroot(HTTPD_DOCUMENT_ROOT);
? //chdir("/");
? //chdir(HTTPD_DOCUMENT_ROOT);
? chdir("/home/httpd");
? if (argc > 1 && !strcmp(argv[1], "-i")) {
原來這里將目錄改變到根目錄,怎么這么做呢,看來這代碼真的很有問題,難怪我編譯uClinux是老是出現很低級的錯誤。改成chdir(HTTPD_DOCUMENT_ROOT);在打開瀏覽器測試,服務器根目錄在程序運行的目錄,不是/home/httpd,打印就是段錯誤,多半是vdocument_root沒有傳進來,估計是makefile寫的還有些問題。如是直接改成chdir("/home/httpd"),這下到了我存放網頁的目錄了。寫了一個index.htm測試網頁放到目錄下,網頁打開了。
今天makefile 實踐就到此了,下回就把boa給編譯了。
參考文章:MAKEFILE的編寫(轉載)