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...