向大家推薦一個C/C 通用Makefile
性別:
文章: 55積分: 60來自: 杭州
發表時間:2010-09-29最後修改:2010-09-29引用收藏
<>獵頭職位:北京: 【北京】誠聘java技術負責人相關文章:在 Leopard 下配置 ruby on rail 環境使用TCMalloc優化mysql在MacOSX上安裝RMagick[Installing RMagick on OS X一文的翻譯]推薦圈子: D語言更多相關推薦本文推薦了一個用於對C/C++程序進行編譯和連接以產生可執行程序的通用Makefile。在使用Makefile之前,只需對它進行一些簡單的設置即可;而且一經設置,即使以後對源程序文件有所增減一般也不再需要改動Makefile。因此,即便是一個沒有學習過Makefile書寫規則的人,也可以為自己的C/C++程序快速建立一個可工作的Makefile。這個Makefile可以在GNUMake和GCC編譯器下正常工作。但是不能保證對於其它版本的Make和編譯器也能正常工作。此Makefile的使用方法如下:程序目錄的組織盡量將自己的源程序集中在一個目錄中,並且把Makefile和源程序放在一起,這樣用起來比較方便。當然,也可以將源程序分類存放在不同的目錄中。在程序目錄中創建一個名為Makefile的文本文件,將後面列出的Makefile的內容複製到這個文件中。(注意:在複製的過程中,Makfile中各命令前面的Tab字元有可能被轉換成若干個空格。這種情況下需要把Makefile命令前面的這些空格替換為一個Tab。)將當前工作目錄切換到Makefile所在的目錄。目前,這個Makefile只支持在當前目錄中的調用,不支持當前目錄和Makefile所在的路徑不是同一目錄的情況。指定可執行文件程序編譯和連接成功後產生的可執行文件在Makefile中的PROGRAM變數中設定。這一項不能為空。為自己程序的可執行文件起一個有意義的名子吧。指定源程序要編譯的源程序由其所在的路徑和文件的擴展名兩項來確定。由於頭文件是通過包含來使用的,所以在這裡說的源程序不應包含頭文件。程序所在的路徑在SRCDIRS中設定。如果源程序分布在不同的目錄中,那麼需要在SRCDIRS中一一指定,並且路徑名之間用空格分隔。在SRCEXTS中指定程序中使用的文件類型。C/C++程序的擴展名一般有比較固定的幾種形式:.c、.C、.cc、.cpp、.CPP、.c++、.cp、或者.cxx(參見mangcc)。擴展名決定了程序是C還是C++程序:.c是C程序,其它擴展名表示C++程序。一般固定使用其中的一種擴展名即可。但是也有可能需要使用多種擴展名,這可以在SOURCE_EXT中一一指定,各個擴展名之間用空格分隔。雖然並不常用,但是C程序也可以被作為C++程序編譯。這可以通過在Makefile中設置CC=$(CXX)和CFLAGS=$(CXXFLAGS)兩項即可實現。這個Makefile支持C、C++以及C/C++混合三種編譯方式:如果只指定.c擴展名,那麼這是一個C程序,用$(CC)表示的編譯命令進行編譯和連接。如果指定的是除.c之外的其它擴展名(如.cc、.cpp、.cxx等),那麼這是一個C++程序,用$(CXX)進行編譯和連接。如果既指定了.c,又指定了其它C++擴展名,那麼這是C/C++混合程序,將用$(CC)編譯其中的C程序,用$(CXX)編譯其中的C++程序,最後再用$(CXX)連接程序。這些工作都是make根據在Makefile中提供的程序文件類型(擴展名)自動判斷進行的,不需要用戶干預。指定編譯選項編譯選項由三部分組成:預處理選項、編譯選項以及連接選項,分別由CPPFLAGS、CFLAGS與CXXFLAGS、LDFLAGS指定。CPPFLAGS選項可參考C預處理命令cpp的說明,但是注意不能包含-M以及和-M有關的選項。如果是C/C++混合編程,也可以在這裡設置C/C++的一些共同的編譯選項。CFLAGS和CXXFLAGS兩個變數通常用來指定編譯選項。前者僅僅用於指定C程序的編譯選項,後者僅僅用於指定C++程序的編譯選項。其實也可以在兩個變數中指定一些預處理選項(即一些本來應該放在CPPFLAGS中的選項),和CPPFLAGS並沒有明確的界限。連接選項在LDFLAGS中指定。如果只使用C/C++標準庫,一般沒有必要設置。如果使用了非標準庫,應該在這裡指定連接需要的選項,如庫所在的路徑、庫名以及其它聯接選項。現在的庫一般都提供了一個相應的.pc文件來記錄使用庫所需要的預編譯選項、編譯選項和連接選項等信息,通過pkg-config可以動態提取這些選項。與由用戶顯式指定各個選項相比,使用pkg-config來訪問庫提供的選項更方便、更具通用性。在後面可以看到一個GTK+程序的例子,其編譯和連接選項的指定就是用pkg-config實現的。編譯和連接上面的各項設置好之後保存Makefile文件。執行make命令,程序就開始編譯了。命令make會根據Makefile中設置好的路徑和文件類型搜索源程序文件,然後根據文件的類型調用相應的編譯命令、使用相應的編譯選項對程序進行編譯。編譯成功之後程序的連接會自動進行。如果沒有錯誤的話最終會產生程序的可執行文件。注意:在對程序編譯之後,會產生和源程序文件一一對應的.d文件。這是表示依賴關係的文件,通過它們make決定在源程序文件變動之後要進行哪些更新。為每一個源程序文件建立相應的.d文件這也是GNUMake推薦的方式。Makefile目標(Targets)下面是關於這個Makefile提供的目標以及它所完成的功能:make編譯和連接程序。相當於makeall。makeobjs僅僅編譯程序產生.o目標文件,不進行連接(一般很少單獨使用)。makeclean刪除編譯產生的目標文件和依賴文件。makecleanall刪除目標文件、依賴文件以及可執行文件。makerebuild重新編譯和連接程序。相當於makeclean&&makeall。關於這個Makefile的實現原理不準備詳細解釋了。如果有興趣的話,可參考文末列出的「參考資料」。Makefile的內容如下:C代碼
##############################################################GenericMakefileforC/C++Program##License:GPL(GeneralPublicLicense)#Author:whyglinux<whyglinuxATgmailDOTcom>#Date:2006/03/04(version0.1)#2007/03/24(version0.2)#2007/04/09(version0.3)#2007/06/26(version0.4)#2008/04/05(version0.5)##Description:#------------#Thisisaneasilycustomizablemakefiletemplate.Thepurposeisto#provideaninstantbuildingenvironmentforC/C++programs.##ItsearchesalltheC/C++sourcefilesinthespecifieddirectories,#makesdependencies,compilesandlinkstoformanexecutable.##BesidesitsdefaultabilitytobuildC/C++programswhichuseonly#standardC/C++libraries,youcancustomizetheMakefiletobuild#thoseusingotherlibraries.Oncedone,withoutanychangesyoucan#thenbuildprogramsusingthesameorlesslibraries,evenifsource#filesarerenamed,addedorremoved.Therefore,itisparticularly#convenienttouseittobuildcodesforexperimentalorstudyuse.##GNUmakeisexpectedtousetheMakefile.Otherversionsofmakes#mayormaynotwork.##Usage:#------#1.CopytheMakefiletoyourprogramdirectory.#2.Customizeinthe"CustomizableSection"onlyifnecessary:#*tousenon-standardC/C++libraries,setpre-processororcompiler#optionsto<MY_CFLAGS>andlinkeronesto<MY_LIBS>#(SeeMakefile.gtk+-2.0foranexample)#*tosearchsourcesinmoredirectories,setto<SRCDIRS>#*tospecifyyourfavoriteprogramname,setto<PROGRAM>#3.Typemaketostartbuildingyourprogram.##MakeTarget:#------------#TheMakefileprovidesthefollowingtargetstomake:#$makecompileandlink#$makeNODEP=yescompileandlinkwithoutgeneratingdependencies#$makeobjscompileonly(nolinking)#$maketagscreatetagsforEmacseditor#$makectagscreatectagsforVIeditor#$makecleancleanobjectsandtheexecutablefile#$makedistcleancleanobjects,theexecutableanddependencies#$makehelpgettheusageofthemakefile##===========================================================================##CustomizableSection:adaptthosevariablestosuityourprogram.##==========================================================================#Thepre-processorandcompileroptions.MY_CFLAGS=#Thelinkeroptions.MY_LIBS=#Thepre-processoroptionsusedbythecpp(mancppformore).CPPFLAGS=-Wall#Theoptionsusedinlinkingaswellasinanydirectuseofld.LDFLAGS=#Thedirectoriesinwhichsourcefilesreside.#Ifnotspecified,onlythecurrentdirectorywillbeserached.SRCDIRS=#Theexecutablefilename.#Ifnotspecified,currentdirectorynameor`a.out"willbeused.PROGRAM=##ImplicitSection:changethefollowingonlywhennecessary.##==========================================================================#Thesourcefiletypes(headersexcluded).#.cindicatesCsourcefiles,andothersC++ones.SRCEXTS=.c.C.cc.cpp.CPP.c++.cxx.cp#Theheaderfiletypes.HDREXTS=.h.H.hh.hpp.HPP.h++.hxx.hp#Thepre-processorandcompileroptions.#Userscanoverridethosevariablesfromthecommandline.CFLAGS=-g-O2CXXFLAGS=-g-O2#TheCprogramcompiler.#CC=gcc#TheC++programcompiler.#CXX=g++#Un-commentthefollowinglinetocompileCprogramsasC++ones.#CC=$(CXX)#Thecommandusedtodeletefile.#RM=rm-fETAGS=etagsETAGSFLAGS=CTAGS=ctagsCTAGSFLAGS=##StableSection:usuallynoneedtobechanged.Butyoucanaddmore.##==========================================================================SHELL=/bin/shEMPTY=SPACE=$(EMPTY)$(EMPTY)ifeq($(PROGRAM),)CUR_PATH_NAMES=$(subst/,$(SPACE),$(subst$(SPACE),_,$(CURDIR)))PROGRAM=$(word$(words$(CUR_PATH_NAMES)),$(CUR_PATH_NAMES))ifeq($(PROGRAM),)PROGRAM=a.outendifendififeq($(SRCDIRS),)SRCDIRS=.endifSOURCES=$(foreachd,$(SRCDIRS),$(wildcard$(addprefix$(d)/*,$(SRCEXTS))))HEADERS=$(foreachd,$(SRCDIRS),$(wildcard$(addprefix$(d)/*,$(HDREXTS))))SRC_CXX=$(filter-out%.c,$(SOURCES))OBJS=$(addsuffix.o,$(basename$(SOURCES)))DEPS=$(OBJS:.o=.d)##Definesomeusefulvariables.DEP_OPT=$(shellif`$(CC)--version|grep"GCC">/dev/null`;thenecho"-MM-MP";elseecho"-M";fi)DEPEND=$(CC)$(DEP_OPT)$(MY_CFLAGS)$(CFLAGS)$(CPPFLAGS)DEPEND.d=$(subst-g,,$(DEPEND))COMPILE.c=$(CC)$(MY_CFLAGS)$(CFLAGS)$(CPPFLAGS)-cCOMPILE.cxx=$(CXX)$(MY_CFLAGS)$(CXXFLAGS)$(CPPFLAGS)-cLINK.c=$(CC)$(MY_CFLAGS)$(CFLAGS)$(CPPFLAGS)$(LDFLAGS)LINK.cxx=$(CXX)$(MY_CFLAGS)$(CXXFLAGS)$(CPPFLAGS)$(LDFLAGS).PHONY:allobjstagsctagscleandistcleanhelpshow#Deletethedefaultsuffixes.SUFFIXES:all:$(PROGRAM)#Rulesforcreatingdependencyfiles(.d).#------------------------------------------%.d:%.c@echo-n$(dir$<)>$@@$(DEPEND.d)$<>>$@%.d:%.C@echo-n$(dir$<)>$@@$(DEPEND.d)$<>>$@%.d:%.cc@echo-n$(dir$<)>$@@$(DEPEND.d)$<>>$@%.d:%.cpp@echo-n$(dir$<)>$@@$(DEPEND.d)$<>>$@%.d:%.CPP@echo-n$(dir$<)>$@@$(DEPEND.d)$<>>$@%.d:%.c++@echo-n$(dir$<)>$@@$(DEPEND.d)$<>>$@%.d:%.cp@echo-n$(dir$<)>$@@$(DEPEND.d)$<>>$@%.d:%.cxx@echo-n$(dir$<)>$@@$(DEPEND.d)$<>>$@#Rulesforgeneratingobjectfiles(.o).#----------------------------------------objs:$(OBJS)%.o:%.c$(COMPILE.c)$<-o$@%.o:%.C$(COMPILE.cxx)$<-o$@%.o:%.cc$(COMPILE.cxx)$<-o$@%.o:%.cpp$(COMPILE.cxx)$<-o$@%.o:%.CPP$(COMPILE.cxx)$<-o$@%.o:%.c++$(COMPILE.cxx)$<-o$@%.o:%.cp$(COMPILE.cxx)$<-o$@%.o:%.cxx$(COMPILE.cxx)$<-o$@#Rulesforgeneratingthetags.#-------------------------------------tags:$(HEADERS)$(SOURCES)$(ETAGS)$(ETAGSFLAGS)$(HEADERS)$(SOURCES)ctags:$(HEADERS)$(SOURCES)$(CTAGS)$(CTAGSFLAGS)$(HEADERS)$(SOURCES)#Rulesforgeneratingtheexecutable.#-------------------------------------$(PROGRAM):$(OBJS)ifeq($(SRC_CXX),)#Cprogram$(LINK.c)$(OBJS)$(MY_LIBS)-o$@@echoType./$@toexecutetheprogram.else#C++program$(LINK.cxx)$(OBJS)$(MY_LIBS)-o$@@echoType./$@toexecutetheprogram.endififndefNODEPifneq($(DEPS),)sinclude$(DEPS)endifendifclean:$(RM)$(OBJS)$(PROGRAM)$(PROGRAM).exedistclean:clean$(RM)$(DEPS)TAGS#Showhelp.help:@echo"GenericMakefileforC/C++Programs(gcmakefile)version0.5"@echo"Copyright(C)2007,2008whyglinux<whyglinux@hotmail.com>"@echo@echo"Usage:make[TARGET]"@echo"TARGETS:"@echo"all(=make)compileandlink."@echo"NODEP=yesmakewithoutgeneratingdependencies."@echo"objscompileonly(nolinking)."@echo"tagscreatetagsforEmacseditor."@echo"ctagscreatectagsforVIeditor."@echo"cleancleanobjectsandtheexecutablefile."@echo"distcleancleanobjects,theexecutableanddependencies."@echo"showshowvariables(fordebuguseonly)."@echo"helpprintthismessage."@echo@echo"Reportbugsto<whyglinuxATgmailDOTcom>."#Showvariables(fordebuguseonly.)show:@echo"PROGRAM:"$(PROGRAM)@echo"SRCDIRS:"$(SRCDIRS)@echo"HEADERS:"$(HEADERS)@echo"SOURCES:"$(SOURCES)@echo"SRC_CXX:"$(SRC_CXX)@echo"OBJS:"$(OBJS)@echo"DEPS:"$(DEPS)@echo"DEPEND:"$(DEPEND)@echo"COMPILE.c:"$(COMPILE.c)@echo"COMPILE.cxx:"$(COMPILE.cxx)@echo"link.c:"$(LINK.c)@echo"link.cxx:"$(LINK.cxx)##EndoftheMakefile##Suggestionsarewelcome##Allrightsreserved############################################################################################################################## Generic Makefile for C/C++ Program## License: GPL (General Public License)# Author: whyglinux <whyglinux AT gmail DOT com># Date: 2006/03/04 (version 0.1)# 2007/03/24 (version 0.2)# 2007/04/09 (version 0.3)# 2007/06/26 (version 0.4)# 2008/04/05 (version 0.5)## Description:# ------------# This is an easily customizable makefile template. The purpose is to# provide an instant building environment for C/C++ programs.## It searches all the C/C++ source files in the specified directories,# makes dependencies, compiles and links to form an executable.## Besides its default ability to build C/C++ programs which use only# standard C/C++ libraries, you can customize the Makefile to build# those using other libraries. Once done, without any changes you can# then build programs using the same or less libraries, even if source# files are renamed, added or removed. Therefore, it is particularly# convenient to use it to build codes for experimental or study use.## GNU make is expected to use the Makefile. Other versions of makes# may or may not work.## Usage:# ------# 1. Copy the Makefile to your program directory.# 2. Customize in the "Customizable Section" only if necessary:# * to use non-standard C/C++ libraries, set pre-processor or compiler# options to <MY_CFLAGS> and linker ones to <MY_LIBS># (See Makefile.gtk+-2.0 for an example)# * to search sources in more directories, set to <SRCDIRS># * to specify your favorite program name, set to <PROGRAM># 3. Type make to start building your program.## Make Target:# ------------# The Makefile provides the following targets to make:# $ make compile and link# $ make NODEP=yes compile and link without generating dependencies# $ make objs compile only (no linking)# $ make tags create tags for Emacs editor# $ make ctags create ctags for VI editor# $ make clean clean objects and the executable file# $ make distclean clean objects, the executable and dependencies# $ make help get the usage of the makefile##===========================================================================## Customizable Section: adapt those variables to suit your program.##==========================================================================# The pre-processor and compiler options.MY_CFLAGS =# The linker options.MY_LIBS =# The pre-processor options used by the cpp (man cpp for more).CPPFLAGS = -Wall# The options used in linking as well as in any direct use of ld.LDFLAGS =# The directories in which source files reside.# If not specified, only the current directory will be serached.SRCDIRS =# The executable file name.# If not specified, current directory name or `a.out" will be used.PROGRAM =## Implicit Section: change the following only when necessary.##==========================================================================# The source file types (headers excluded).# .c indicates C source files, and others C++ ones.SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp# The header file types.HDREXTS = .h .H .hh .hpp .HPP .h++ .hxx .hp# The pre-processor and compiler options.# Users can override those variables from the command line.CFLAGS = -g -O2CXXFLAGS= -g -O2# The C program compiler.#CC = gcc# The C++ program compiler.#CXX = g++# Un-comment the following line to compile C programs as C++ ones.#CC = $(CXX)# The command used to delete file.#RM = rm -fETAGS = etagsETAGSFLAGS =CTAGS = ctagsCTAGSFLAGS =## Stable Section: usually no need to be changed. But you can add more.##==========================================================================SHELL = /bin/shEMPTY =SPACE = $(EMPTY) $(EMPTY)ifeq ($(PROGRAM),)CUR_PATH_NAMES = $(subst /,$(SPACE),$(subst $(SPACE),_,$(CURDIR)))PROGRAM = $(word $(words $(CUR_PATH_NAMES)),$(CUR_PATH_NAMES))ifeq ($(PROGRAM),)PROGRAM = a.outendifendififeq ($(SRCDIRS),)SRCDIRS = .endifSOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))HEADERS = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS))))SRC_CXX = $(filter-out %.c,$(SOURCES))OBJS = $(addsuffix .o, $(basename $(SOURCES)))DEPS = $(OBJS:.o=.d)## Define some useful variables.DEP_OPT = $(shell if `$(CC) --version | grep "GCC" >/dev/null`; then echo "-MM -MP"; else echo "-M"; fi )DEPEND = $(CC) $(DEP_OPT) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS)DEPEND.d = $(subst -g ,,$(DEPEND))COMPILE.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) -cCOMPILE.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -cLINK.c = $(CC) $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)LINK.cxx = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS).PHONY: all objs tags ctags clean distclean help show# Delete the default suffixes.SUFFIXES:all: $(PROGRAM)# Rules for creating dependency files (.d).#------------------------------------------%.d:%.c@echo -n $(dir $<) > $@@$(DEPEND.d) $< >> $@%.d:%.C@echo -n $(dir $<) > $@@$(DEPEND.d) $< >> $@%.d:%.cc@echo -n $(dir $<) > $@@$(DEPEND.d) $< >> $@%.d:%.cpp@echo -n $(dir $<) > $@@$(DEPEND.d) $< >> $@%.d:%.CPP@echo -n $(dir $<) > $@@$(DEPEND.d) $< >> $@%.d:%.c++@echo -n $(dir $<) > $@@$(DEPEND.d) $< >> $@%.d:%.cp@echo -n $(dir $<) > $@@$(DEPEND.d) $< >> $@%.d:%.cxx@echo -n $(dir $<) > $@@$(DEPEND.d) $< >> $@# Rules for generating object files (.o).#----------------------------------------objs:$(OBJS)%.o:%.c$(COMPILE.c) $< -o $@%.o:%.C$(COMPILE.cxx) $< -o $@%.o:%.cc$(COMPILE.cxx) $< -o $@%.o:%.cpp$(COMPILE.cxx) $< -o $@%.o:%.CPP$(COMPILE.cxx) $< -o $@%.o:%.c++$(COMPILE.cxx) $< -o $@%.o:%.cp$(COMPILE.cxx) $< -o $@%.o:%.cxx$(COMPILE.cxx) $< -o $@# Rules for generating the tags.#-------------------------------------tags: $(HEADERS) $(SOURCES)$(ETAGS) $(ETAGSFLAGS) $(HEADERS) $(SOURCES)ctags: $(HEADERS) $(SOURCES)$(CTAGS) $(CTAGSFLAGS) $(HEADERS) $(SOURCES)# Rules for generating the executable.#-------------------------------------$(PROGRAM):$(OBJS)ifeq ($(SRC_CXX),) # C program$(LINK.c) $(OBJS) $(MY_LIBS) -o $@@echo Type ./$@ to execute the program.else # C++ program$(LINK.cxx) $(OBJS) $(MY_LIBS) -o $@@echo Type ./$@ to execute the program.endififndef NODEPifneq ($(DEPS),)sinclude $(DEPS)endifendifclean:$(RM) $(OBJS) $(PROGRAM) $(PROGRAM).exedistclean: clean$(RM) $(DEPS) TAGS# Show help.help:@echo "Generic Makefile for C/C++ Programs (gcmakefile) version 0.5"@echo "Copyright (C) 2007, 2008 whyglinux <whyglinux@hotmail.com>"@echo@echo "Usage: make [TARGET]"@echo "TARGETS:"@echo " all (=make) compile and link."@echo " NODEP=yes make without generating dependencies."@echo " objs compile only (no linking)."@echo " tags create tags for Emacs editor."@echo " ctags create ctags for VI editor."@echo " clean clean objects and the executable file."@echo " distclean clean objects, the executable and dependencies."@echo " show show variables (for debug use only)."@echo " help print this message."@echo@echo "Report bugs to <whyglinux AT gmail DOT com>."# Show variables (for debug use only.)show:@echo "PROGRAM :" $(PROGRAM)@echo "SRCDIRS :" $(SRCDIRS)@echo "HEADERS :" $(HEADERS)@echo "SOURCES :" $(SOURCES)@echo "SRC_CXX :" $(SRC_CXX)@echo "OBJS :" $(OBJS)@echo "DEPS :" $(DEPS)@echo "DEPEND :" $(DEPEND)@echo "COMPILE.c :" $(COMPILE.c)@echo "COMPILE.cxx :" $(COMPILE.cxx)@echo "link.c :" $(LINK.c)@echo "link.cxx :" $(LINK.cxx)## End of the Makefile ## Suggestions are welcome ## All rights reserved ################################################################下面提供兩個例子來具體說明上面Makefile的用法。例一 HelloWorld程序這個程序的功能是輸出Hello,world!這樣一行文字。由hello.h、hello.c、main.cxx三個文件組成。前兩個文件是C程序,後一個是C++程序,因此這是一個C和C++混編程序。C代碼
/*Filename:hello.h*Cheaderfile*/#ifndefHELLO_H#defineHELLO_H#ifdef__cplusplusextern"C"{#endifvoidprint_hello();#ifdef__cplusplus}#endif#endif/*Filename:hello.c*Csourcefile.*/#include"hello.h"#include<stdio.h>voidprint_hello(){puts("Hello,world!");}/*Filename:main.cxx*C++sourcefile.*/#include"hello.h"intmain(){print_hello();return0;}/* File name: hello.h* C header file*/#ifndef HELLO_H#define HELLO_H#ifdef __cplusplusextern "C" {#endifvoid print_hello();#ifdef __cplusplus}#endif#endif/* File name: hello.c* C source file.*/#include "hello.h"#include <stdio.h>void print_hello(){puts( "Hello, world!" );}/* File name: main.cxx* C++ source file.*/#include "hello.h"int main(){print_hello();return 0;}建立一個新的目錄,然後把這三個文件拷貝到目錄中,也把 Makefile 文件拷貝到目錄中。之後,對 Makefile 的相關項目進行如下設置:PROGRAM := hello # 設置運行程序名SRCDIRS := . # 源程序位於當前目錄下SRCEXTS := .c .cxx # 源程序文件有 .c 和 .cxx 兩種類型CFLAGS := -g # 為 C 目標程序包含 GDB 可用的調試信息CXXFLAGS := -g # 為 C++ 目標程序包含 GDB 可用的調試信息由於這個簡單的程序只使用了 C 標準庫的函數(puts),所以對於 CFLAGS 和 CXXFLAGS 沒有過多的要求,LDFLAGS 和 CPPFLAGS 選項也無需設置。經過上面的設置之後,執行 make 命令就可以編譯程序了。如果沒有錯誤出現的話,./hello 就可以運行程序了。如果修改了源程序的話,可以看到只有和修改有關的源文件被編譯。也可以再為程序添加新的源文件,只要它們的擴展名是已經在 Makefile 中設置過的,那麼就沒有必要修改 Makefile。例二 GTK+版HelloWorld程序這個GTK+2.0版的HelloWorld程序可以從下面的網址上得到:http://www.gtk.org/tutorial/c58.html#SEC-HELLOWORLD。當然,要編譯GTK+程序,還需要你的系統上已經安裝好了GTK+。跟第一個例子一樣,單獨創建一個新的目錄,把上面網頁中提供的程序保存為main.c文件。對Makefile做如下設置:PROGRAM:=hello#設置運行程序名SRCDIRS:=.#源程序位於當前目錄下SRCEXTS:=.c#源程序文件只有.c一種類CFLAGS:=`pkg-config--cflagsgtk+-2.0`#CFLAGSLDFLAGS:=`pkg-config--libsgtk+-2.0`#LDFLAGS這是一個C程序,所以CXXFLAGS沒有必要設置——即使被設置了也不會被使用。編譯和連接GTK+庫所需要的CFLAGS和LDFLAGS由pkg-config程序自動產生。現在就可以運行make命令編譯、./hello執行這個GTK+程序了。gcmakefile-0.5.tar.gz (3.7 KB)下載次數: 48
推薦閱讀:
※windows下使用cmake+mingw配置makefile(一)
※[原聲天堂] 原聲大碟 -《不能說的秘密 (Secret)》專輯[320K/MP3] [Rayfile/115]
※python socket.error: [Errno 9] Bad file descriptor什麼原因?
※為什麼有道詞典默認安裝在C:Documents and Settings 而不是C:Program Files?出於什麼考慮?