一cmake和makefile區別
要說明區別,我們先要區分下面三類工具:
1.項目構建生成工具
首先cmake是項目構建生成工具,cmake的代碼可以與平臺系統和編譯器無關。類似cmake的工具還有autotools、qmake、GN,其中qmake已基本由cmake替代。cmake下載地址 cmake.org.cn
也就是說cmake是用來生成makefile和其他項目生成工具配置的。
2.項目構建工具
類似make的工具有 Ninja 、nmake 、devenv(vs)。
makefile 可以理解為是make工具使用的代碼,make讀取makefile中的配置信息來實現編譯、鏈接和部署。
3.項目編譯鏈接工具
比如有:gcc、 cl.exe 、link 、ar
使用這些工具才能把源碼和資源編譯成執行程序和庫。
下圖時我畫的各類工具之間的關系:
二為什么不直接使用項目編譯鏈接工具?
那為什么要有這三類工具,首先說下“項目編譯鏈接工具” 只是使用這些工具其實就能夠編譯出所有的目標,但由于命令過于復雜,編譯的流程不好控制。比如我們編譯一個執行程序
g++ first_main.cpp -o first_main -I ../include -L../../lib -lpthread
這種方式在涉及到多個多項目、多庫、多參數和各種依賴關系是維護難度很大。還有涉及到換編譯器時,比如從g++換成clang或者cl.exe,也需要改動很多內容。
那如果換成make:
INCLUDE=-I../include
LIBS=-lpthread
first_main:first_main.o
${CC} -o $@ $< ${INCLUDE} ${LIBS}
依賴關系和所有目標都可以很清晰的管理。
三為什么不直接使用make或者Ninja
其實很多公司和項目就是直接使用make的,但make代碼規則嚴格,語法過于復雜,在做跨平臺和跨編譯器時的管理更加復雜,移植到不同環境的成本過大。這是就要引入cmake來生成make或者NInja的文件。Android 的NDK開發和鴻蒙native SDK都使用了cmake生成Ninja項目文件。
cmake本身配置就與環境和編譯器完全無關了,可以由生成時指定。
cmake編譯一個直接程序的配置也就一個函數add_executable的調用:
cmake_minimum_required(VERSION 3.20)
project(xlog)
add_executable(first_main first_main.cpp)
四cmake指定編譯器(cmake -G)
可以直接輸入,可以看到當前版本支持的編譯器
cmake -G
1.CMake支持的編譯器列表
[if !supportLists]·?[endif]Visual Studio 17 2022 = Generates Visual Studio 2022 project files.
Use -A option to specify architecture.
Visual Studio 16 2019 = Generates Visual Studio 2019 project files.
Use -A option to specify architecture.
Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
Optional [arch] can be "Win64" or "ARM".
Visual Studio 10 2010 [arch] = Deprecated. Generates Visual Studio 2010
project files. Optional [arch] can be
"Win64" or "IA64".
Visual Studio 9 2008 [arch] = Generates Visual Studio 2008 project files.
Optional [arch] can be "Win64" or "IA64".
Borland Makefiles = Generates Borland makefiles.
NMake Makefiles = Generates NMake makefiles.
NMake Makefiles JOM = Generates JOM makefiles.
MSYS Makefiles = Generates MSYS makefiles.
MinGW Makefiles = Generates a make file for use with
mingw32-make.
Green Hills MULTI = Generates Green Hills MULTI files
(experimental, work-in-progress).
Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Ninja Multi-Config = Generates build-.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.
CodeBlocks - NMake Makefiles JOM
= Generates CodeBlocks project files.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - MinGW Makefiles = Generates CodeLite project files.
CodeLite - NMake Makefiles = Generates CodeLite project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles = Generates CodeLite project files.
Eclipse CDT4 - NMake Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - MinGW Makefiles
= Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
Kate - MinGW Makefiles = Generates Kate project files.
Kate - NMake Makefiles = Generates Kate project files.
Kate - Ninja = Generates Kate project files.
Kate - Unix Makefiles = Generates Kate project files.
Sublime Text 2 - MinGW Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - NMake Makefiles
= Generates Sublime Text 2 project files.
Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.
Sublime Text 2 - Unix Makefiles
= Generates Sublime Text 2 project files.
2.主要的編譯器指定示例
a. 目錄結構
first_cmake.cpp
CMakeList.txt
更換編譯器需要刪除原來的編譯緩存路徑build,或者換一個目錄生成。
b. Visual Studio 編譯器支持(生成項目文件和解決方案)
cmake -S . -B build -G "Visual Studio 17 2022"
cmake -S . -B build -G "Visual Studio 16 2019"
cmake -S . -B build -G "Visual Studio 15 2017"
cmake -S . -B build -G "Visual Studio 10 2010"
c. windows下nmake支持(vs控制臺編譯)
cmake -S . -B build -G "NMake Makefiles"
d. Ninja (安卓和鴻蒙方案)
cmake -S . -B build -G Ninja
更多編譯器資料可以進入cmake.org.cn查看官方手冊中的cmake-generators(7)內容