makefile文件編寫詳解


makefile文件   1.實例:makefile.bak .PHONY:clean #顯式指定clean 為偽目標,防止在當前目錄下存在clean文件是無法執行清理工作 ping:ping.o main.o g++ -Wall -g  main.o ping.o -o ping -lpthread ping.o:ping.cpp ping.h g++ -Wall -g -c ping.cpp -o ping.o main.o:main.cpp g++ -Wall -g -c main.cpp -o main.o clean:    echo begin delete ... rm -f *.o   2.makefile自動化變量makefile    .PHONY:clean #顯式指定clean 為偽目標,防止在當前目錄下存在clean文件是無法執行清理工作 OBJECTS=ping.o main.o ping:$(OBJECTS) #自定義變量 g++ -Wall -g  $^ -o $@ -lpthread      #$^ 依賴列表的所有項ping.o main.o $@ 表示目標項ping ping.o:ping.cpp ping.h g++ -Wall -g -c $< -o $@                  #$<依賴列表的第一項ping.cpp main.o:main.cpp @g++ -Wall -g -c $< -o $@ #在命令前加@,表示不顯示命令 clean: rm -f $(OBJECTS) #自動化變量和自定義變量的使用 makefile的執行:make clean -f makefile.bak   -f 指定要執行的makefile文件   3.makefile默認推導規則 實例: 生成多個可執行文件 01Test.cpp 02Test.cpp .PHONY:clean all BIN=01Test 02Test all:$(BIN) clean:   rm -f $(BIN) 執行后生成01Test 02Test可執行文件,系統執行的事隱含推導規則,也可以自己編寫推導規則 模式規則:%.o:%.c 01Test.cpp 02Test.cpp .PHONY:clean all BIN=01Test 02Test all:$(BIN) %.o:%.c g++ -Wall -g -c $< -o $@ 01Test:01Test.o g++ -Wall -g $^ -o $@ 02Test:02Test.o g++ -Wall -g $^ -o $@ clean: rm -f *.o $(BIN) 后綴規則:.c.o: .PHONY:clean all BIN=01Test 02Test all:$(BIN) .c.o: g++ -Wall -g -c $< -o $@ 01Test:01Test.o g++ -Wall -g $^ -o $@ 02Test:02Test.o g++ -Wall -g $^ -o $@ clean: rm -f *.o $(BIN) 定義變量進一步簡化makefile: .PHONY:clean all CC=g++ CFLAGS=-Wall -g BIN=01Test 02Test all:$(BIN) .c.o: $(CC) $(CFLAGS) -c $< -o $@ 01Test:01Test.o $(CC) $(CFLAGS) $^ -o $@ 02Test:02Test.o $(CC) $(CFLAGS) $^ -o $@ clean: rm -f *.o $(BIN)

多級目錄makefile的實現:
1.make常用內嵌函數
   2.二級目錄的實現
實例

.PHONY:clean 

 #顯式指定clean 為偽目標,防止在當前目錄下存在clean文件是無法執行清理工作

CC    =g++ CFLAGS =-Wall -g

BIN = ping SUBDIR =$(shell ls -d */)

ROOTSRC =$(wildcard *.cpp)   #當前目錄下匹配模式的文件

ROOTOBJ =$(ROOTSRC:%.cpp=%.o)

SUBSRC =$(shell find $(SUBDIR) -name '*.cpp')  #指定目錄下的源文件

SUBOBJ =$(SUBSRC:%.cpp=%.o)    #模式替換函數

$(BIN):$(ROOTOBJ) $(SUBOBJ)

   $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ) -lpthread

.c.o:  

  $(CC) $(CFLAGS) -c  $< -o $@

clean:

   @rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)

 
         

#二級目錄makefile文件的使用

      3.多級目錄、多個makefile的實現


 
 
         

SUBDIRS = Test1 Test2
.PHONY:default all clean $(SUBDIRS)
default:all
all clean:
 $(MAKE) $(SUBDIRS) TARGET=$@
$(SUBDIRS):
 $(MAKE) -C $@ $(TARGET)            
 #-C表示進入到目錄 make -C Test1 all等價於make all Test1/makefile


Test1目錄makefile
CC = g++
BIN = Test1
OBJS = Test1.o
.PHONY: all clean print
all:print $(BIN)
print:
 @echo "-----------make all in $(PWD) -----------"
$(BIN):$(OBJS)
 $(CC) $(OBJS) -o $@
%.o:%.cpp
 $(CC) -c $<
clean:
 @echo "-----------make clean in $(PWD) -----------"
 rm -f $(BIN) $(OBJS)
Test2目錄的makefile
CC = g++
BIN = Test2
OBJS = Test2.o
CFLAGS = -Wall -g
.PHONY: all clean print
all:print $(BIN)
print:
 @echo "-----------make all in $(PWD) -----------"
$(BIN):$(OBJS)
 $(CC) $(CFLAGS) $(OBJS) -o $@
%.o:%.cpp
 $(CC) $(CFLAGS) -c $<
clean:
 @echo "-----------make clean in $(PWD) -----------"
 rm -f $(BIN) $(OBJS)









 

Linux 庫的使用: 1.靜態庫(*.a)實質就是把.o文件的集合,歸檔打包     1.1生成.o文件:g++ -Wall hello_fn.c -o hello_fn.o     1.2生成.a文件:ar rcs libhello.a hello_fn.o  (ar 是gnu歸檔工具,rcs('r' 靜態庫存在則替換replace,'c' 不存在則創建,'s' 保存.o文件的索引信息到庫文件中去)     1.3 庫文件的使用:g++ -Wall main.c libhello.a -o main    或者  g++ -Wall -L.  main.c -o main -lhello   由於gcc編譯器默認不會搜索當前目錄,索引用 -L. 在當前目錄搜索庫文件。   2.動態庫(*.so or *.sa)     2.1生成.o文件:g++ -c Test.cpp     2.2生成.so文件:g++ -shared -fPIC Test.o -o libTest.so     2.3使用動態庫:g++ -L. main.o - o main lTest. 當動態庫和靜態庫同時存在是,優先使用動態庫。     2.4程序運行動態庫加載路徑。 a. 拷貝.so文件到系統共享庫/usr/lib/路徑下。 b. 修改系統環境變量,增加庫的路徑。vi~/bash_profile    LD_LIBRARY_PATH=庫的路徑(當前用戶配置)。 c. ldconfig   配置ld.so.conf,ldconfig更新ld.so.cache     vi /etc/ld.so.conf配置庫文件路徑(全局配置)     2.5 lld查看文件包含了哪些庫文件。   3.庫搜索路徑:     3.1 C_INCLUDE_PATH、LIBRARY_PATH     3.2 -I 指定頭文件目錄、-L指定庫文件搜索目錄     3.3 環境變量指定的目錄。 vi ~/.bash_profile   export C_INCLUDE_PATH = /opt/soft/include/ export LIBRARY_PATH=/opt/soft/lib/     .~/.bash_profile 執行一下生效。  ~/  當前用戶根目錄  /系統根目錄     3.4系統指定的目錄。一般系統默認的庫頭文件和庫文件默認在 /usr/include/    /usr/lib/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM