Makefile工程編譯

2021-07-25 23:54:07 字數 2825 閱讀 4107

1.寫在前面

本篇文章講的是接前面makefile之編譯多個可執行程式中第二個需求,並延伸到對正規工程的編譯。

2.工程

我接觸的工程有2種情況:

所有原始檔都放乙個目錄

按模組分放不同的目錄

下面按照這兩種情況講解。

3.所有原始檔都放乙個目錄

不建議所有原始檔都放乙個目錄,當工程大時,乙個目錄下會有很多原始檔,建議採用第二種方式,按模組分放不同的目錄。

編譯這種工程時,比較方便,乙個makefile就可以編譯出可執行檔案,如下:

cc = g++

cflages = -g -wall

include =

libs =

objdir = .

target = obj

srcs :=$(wildcard *.cpp)

objs :=$(patsubst %cpp, %o, $(srcs))

es = $(shell if[-d $(objdir)];then echo "h";else echo "no";fi;)

all: $(target) clean

#轉換為.o檔案

%.o:%.cpp

$(cc) $(cflages) -c $<

$(include)

#將.o檔案鏈結成可執行檔案

$(target):$(objs)

$(cc) $(cflages) -o $@

$(objs) $(libs)

ifeq($(es),no)

@ echo "create obj directory";

@ mkdir -p $(objdir)

endif

mv $@

$(objdir)

clean:

rm -rf *.o

4.按模組分放不同的目錄

按模組分放不同目錄,主要特點就是結構清晰,但是每個模組都需要乙個makefile,最後由乙個makefile編譯出可執行程式。

有三種編譯方法:

每個模組1個makefile,將模組編譯成.o檔案,將.o檔案拷貝到main函式目錄,鏈結成可執行程式。

每個模組1個makefile,將模組編譯成.a檔案靜態鏈結庫,鏈結時指定靜態鏈結庫路徑。

每個模組1個makefile,將模組編譯成.so檔案動態鏈結庫,鏈結時指定動態鏈結庫路徑,執行時,需將可執行程式和.so檔案拷貝至目錄。

4.1 模組的makefile

cc = g++ 

cflages = -g -wall

include =

libs =

objdir = .

target = obj.a

srcs

:=$(wildcard *.cpp)

objs

:=$(patsubst %cpp, %o, $(

srcs))

es = $(shell if[-d $(

objdir)];then echo "h";else echo "no";fi;) all:

$(target) clean

#轉換為.o檔案

%.o:%.cpp

$(cc) $(

cflages) -c $<

$(include)

ifeq($(

es),no)

@ echo "create obj directory";

endif

$(target):

$(objs)

#轉換為.a檔案

ar -crv $@

$(objs)

#轉換為.so檔案

$(cc) -shared -fpic -o $@

$(objs)

#不轉換,則直接使用.o檔案

mv $@

$(objdir)

clean: rm -rf *.o

4.2 main模組的makefile
cc = g++ 

cflages = -g -wall

#此處要加模組標頭檔案路徑

include = -i . -i /home/test

#此處要加靜態鏈結庫的路徑

libs = -l -libobj

objdir = .

target = obj

srcs

:=$(wildcard *.cpp)

#如使用.o檔案,objs後面加上模組.o檔案的全路徑

objs

:=$(patsubst %cpp, %o, $(

srcs))

es = $(shell if[-d $(

objdir)];then echo "h";else echo "no";fi;) all:

$(target) clean

#將main轉換為.o檔案

%.o:%.cpp

$(cc) $(

cflages) -c $<

$(include)

ifeq($(

es),no)

@ echo "create obj directory";

endif

$(target):

$(objs)

$(cc) $(

cflages) -o $@

$(objs) $(

libs)

#不轉換,則直接使用.o檔案

mv $@

$(objdir)

clean: rm -rf *.o

使用makefile編譯C 工程

目錄結構 kexin 外層cmakelists.txt編寫 cmake 最低版本號要求 cmake minimum required version 3.7 fatal error 專案資訊 project kexin include路徑 include directories include 設定...

CMake 工程呼叫 Makefile 編譯專案

本文主要介紹如何將乙個依賴 makefile 專案 midg 移植到 cmake 上。首先介紹專案檔案結構,檔案主要由三個目錄組成 3rdparty include src其中,3rdparty中包含兩個外部函式庫,即metis與parmetis,生成兩個靜態鏈結庫libmetis.a與libpar...

工程Makefile例項

1級makefil phony clean for subdir in subdirs do cd subdir make clean done 級makefile target lib notdir curdir a objs wildcard o cc flags fpic md 靜態庫合成動態...