Makefile和Cmake的聯絡與區別

2021-08-28 22:56:16 字數 2920 閱讀 6695

c/c++程式設計師肯定離不開makefile和cmake,因為如果對這兩個工具不熟悉,那麼你就不是乙個合格的c/c++程式設計師。本文對makefile和cmake,及它們的使用進行了詳細的介紹,本文的目錄如下:

一、makefile詳解

1.1 makefile語法

1.2 makefile示例

二、cmake詳解

2.1 cmake語法

2.2 cmake示例

一、makefile詳解

makefile描述了整個工程的編譯、連線等規則,makefile定義了一些列規則來指定,哪些檔案需要編譯以及如何編譯、需要建立哪些庫檔案以及如 何建立這些庫檔案、如何產生我們想要的可執行檔案。使用makefile,整個工程都可以完全自動化編譯。而且makefile 可以有效的減少編譯和連線的程式,只編譯和連線那些修改的檔案。

1.1  makefile語法

1.1.1

makefile包含了五個重要的東西:顯示規則、隱晦規則、變數定義、檔案指示和注釋。

1. 顯示規則:顯示規則說明了,如何生成乙個或多個目標。這是由makefile指出要生成的檔案和檔案依賴的檔案。

2. 隱晦規則:基於makefile的自動推導功能

3. 變數的定義:一般是字串

4. 檔案指示:一般是在makefile中引用另外乙個makefile檔案;根據某些規則指定makefile中有效的部分;多行

5. 注釋:#指示注釋

makefile有三個非常重要的變數:$@、$^、$#,它們的含義如下:

$@    ---目標檔案

$^      ---所有依賴檔案

$<      ---第乙個依賴檔案

.phony  ---偽目標檔案

makefile的執行過程如下:

1. 在當前目錄下尋找makefile或makefile。

2. 找到第乙個檔案中的第乙個目標檔案,和目標檔案依賴的.o檔案。

3. 如果.o檔案不存在,或是後面.o檔案比target檔案更新,那麼它就會執行後面的語句來生成這個檔案。

4. 最後makefile會根據.o檔案依賴的.h和.c檔案生成.o檔案。

1.1.2

注意:1. clean不要放在target前面。

2. -rm edit  $(objects)  忽略某些檔案的問題。

3. makefile中的命令,必須以[tab]鍵分割。檔案之間最好使用空格分割。

4. -i 或 --include-dir 引數,那麼make就會在這些目錄下去尋找。

5. -l 相當於load lib dir, -lfb303  相當於libfb303.so

1.1.3 g++編譯命令:

1. -g  相當於debug

2. -wall 相當於忽略warnning

3. -o1~3 相當於優化級別

4. -lpthread多執行緒

5. -j8 多執行緒編譯

6. -d相當於巨集定義,-d_yuqiang,那麼#ifdef _yuqiang就是true的。

1.2  makefile示例

cc = gcc  

rm = rm

cflags += -d _yuqiang

all:$(targets)

$(targets):main.c

$(cc) $(cflags) $^ -o $@

clean:

-$(rm) -f *.o

-$(rm) -f $(targets)

二、cmake詳解

cmake是乙個誇平台的安裝(編譯)工具,可以簡單的語句描述所有平台的安裝(編譯過程)。它能輸出各種各樣的makefile或者project檔案,能測試編譯器所支援的c++特性,類似unix下的automake。

2.1 cmake語法

1.  project name 

project( project name )

2. 標頭檔案路徑

include_directories( include )

3. 設定環境變數的值

set( test_dir $)

4. 設定外部庫

set(libraries libm.so)

5. 設定可執行檔案路徑

add_executable( ../bin/bin $)

6. 設定鏈結庫

target_link_libraries(../bin/bin $)

7. 設定**子目錄

add_subdirectory

2.2 cmake示例

[cpp]view plain

copy

#project name  

project(test_math)  

#head file path  

include_directories(  

include  

)  #source directory  

aux_source_directory(src dir_srcs)  

#set environment variable  

set(test_math  

$  )  

#set extern libraries  

set(libraries  

libm.so  

)  #add executable file  

add_executable(../bin/bin $)  

#add link library  

target_link_libraries(../bin/bin $  

參考文獻:

1.  linux  makefile教程: 

2. cmake 學習二: 

3. cmake基本用法: 

cmake 和 makefile的模板

這篇主要是最近在用makefile和cmake。這玩意吧,就賊容易忘,我就默默寫一篇小短文記錄一下。就是放乙個模板,以後直接在模板上做改動。executable為目標的可執行檔名,可以根據具體的情況對其進行修改。executable test 修改隱含規則中巨集 cross compile usr ...

使用cmake來生成makefile

cmake 提供了比 autoconfig 更簡潔的語法 在 linux 平台下使用 cmake 生成 makefile 並編譯的流程如下 編寫cmakelists.txt。執行命令 cmake path 或者 ccmake path 生成makefile path是cmakelists.txt所在...

CMake 工程呼叫 Makefile 編譯專案

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