項(xiàng)目構(gòu)建:單目錄組織的項(xiàng)目Makefile構(gòu)建腳本

會(huì)不會(huì)寫Makefile,可以從一個(gè)側(cè)面說明一個(gè)人是否具備完成大型工程能力。因?yàn)镸akefile關(guān)系到了整個(gè)工程的編譯規(guī)則。(生成目標(biāo)與所有文件的依賴關(guān)系,源文件的依賴關(guān)系)

靜態(tài)鏈接庫與動(dòng)態(tài)鏈接庫的編譯

# 編譯靜態(tài)鏈接庫, c選項(xiàng)表示創(chuàng)建,r選項(xiàng)表示插入/替換 
g++ -c ${SRC}
ar cr libxxx.a ${OBJ}
# 編譯動(dòng)態(tài)鏈接庫,-fPIC生成位置獨(dú)立的代碼,動(dòng)態(tài)載入,多個(gè)進(jìn)程可共享
g++ -fPIC -shared -o libxxx.so ${SRC}

通用Makefile: 所有源文件在一個(gè)目錄里

  • 使用變量
CC        = gcc
XX        = g++
# 編譯鏈接選項(xiàng)
CFLAGS      = -Wall -O3 -g -c  
  • 使用通配符
$@  表示目標(biāo)文件
$^  表示所有的依賴文件
$<  表示第一個(gè)依賴文件
  • 使用變量替換引用
OBJECTS = $(SOURCES:.c=.o)
  • 使用內(nèi)置函數(shù)
wildcard : 擴(kuò)展通配符
notdir : 去除路徑
patsubst :替換通配符

For Example:

文件列表

/src
    Makefile
    sort.c
    sort.h
    test_sort.c

Makefile

CC      = gcc
XX      = g++

# 編譯鏈接選項(xiàng)
CFLAGS    = -Wall -O3 -g -c  
INCLUDES    = -I.
LDFLAGS  = 

# 源文件列表
SOURCES     = $(wildcard *.c *.cpp)
# 目標(biāo)文件列表
OBJECTS     = $(SOURCES:.c=.o)
# OBJECTS       = $(patsubst %.c,%.o,$(patsubst,%.cpp,%.o))
# 可執(zhí)行文件名
TARGET      = test_sort

all: $(TARGET) 
# 生成可執(zhí)行文件(鏈接)
$(TARGET): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@
# 生成目標(biāo)文件(編譯)
%.o: %.c
    $(XX) $(CFLAGS) $(INCLUDES) $< -o $@
.cpp.o:
    $(CC) $(CFLAGS) $(INCLUDES) $< -o $@

# 輔助命令:清除目標(biāo)文件、清除所有生成文件、運(yùn)行可執(zhí)行程序
.PHONY: clean cleanall run
clean:
    rm -rf $(OBJECTS)

cleanall:
    rm -rf $(OBJECTS) $(TARGET)
run:
    ./$(TARGET)

通用Makefile: 源文件分散在不同目錄里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 來自陳浩的一片老文,但絕對(duì)營養(yǎng)。 示例工程:3 個(gè)頭文件*.h,和 8 個(gè) C 文件*.c。 初 編譯過程,源文件...
    周筱魯閱讀 4,787評(píng)論 0 17
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,725評(píng)論 9 468
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評(píng)論 19 139
  • makefile關(guān)系到整個(gè)工程的編譯規(guī)則,一個(gè)工程中的源文件不計(jì)其數(shù),按其類型、功能、模塊分別放在若干的目錄當(dāng)中,...
    Joe_HUST閱讀 1,994評(píng)論 0 3
  • 龔鼎孳《上巳將過金陵》原詩、注釋、翻譯、賞析 【原文】:上巳將過金陵龔鼎孳倚檻春愁玉樹飄,空江鐵鎖野煙消。興懷何限...
    xcy無名閱讀 452評(píng)論 0 0

友情鏈接更多精彩內(nèi)容